Dobrze, że pytasz bo masz w tym kodzie prawie maximum WTF.
Zaraz wyjaśniam.
Po pierwsze nigdy nie zwracaj z metody null. return null; - zabronione!

Za return null grozi kara w postaci obowiązkowego programowania w JavaSkrypcie do lat 2.
Po to jest między innymi jest **optional **żeby **nulla **nie używać.
Ale jak metoda deklaruje, że zwraca optional, a mimo to daje **null **to już za to jest najwyższy wymiar kary: automatyczny zakaz kodowania i zostajesz project managerem - koniec dobrze zapowiadającej się kariery.
Jak powinieneś to napisać? hmmm...
Najkrócej możesz tak (robię to z pamięci - nieczęsto pisze w standardowej javie z jpa- więc mogę się pomylić).
Kopiuj
public Optional<Person> findByEmail(String email){
TypedQuery<Person> query = entityManager.createQuery("select p from Person p where p.email=:email", Person.class);
query.setParameter("email", email);
query.setMaxResults(1);
return query.getResultList().stream().findFirst();
}
Kilka drobnych uwag:
Kopiuj
Optional.ofNullable((Person) result.get(0));
NIe ma sensu - Optional.ofNullable - używasz do opakowania czegoś co może być nullem (np. stary kod, i powinno to się zdarzać rzadko).
Normalnie tylko Optional.of.
a result.get(0) - nie będzie nigdy nullem (albo lista pusta i nawet do tego miejsca w kodzie nie dojdziesz, albo dostaniesz obiekt i wtedy Optional.of(sth)).
TypedQuery query - powinno być TypedQuery<Person> query. Wtedy masz później listę z typem i nie musisz rzutować tak jak tu:(Person) result.get(0).
A poprawne użycie Optional to dopiero poznasz w metodzie, która to wywołuje.
**if ( findByEmail("blabla").isPresent()) ** jest często niepoprawne.
I tu dedykuje przeróbkę wierszyka (jest przecie weekend):
Kopiuj
Ifów mniej oczom lżej,
cieszy się hackerzyk,
return wrócił, empty rzucił,
ku monadom bieży.