Zapytanie które nie ma rezultatu / Hibernate

Zapytanie które nie ma rezultatu / Hibernate
PA
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad 8 lat
  • Postów:80
0

Mam takie zagadnienie. Jest blok instrukcji która rozpoczyna się od pobrania danych z bazy.

Kopiuj
BankAccount currentDbBankAccountAsDefaultInvoice = bankAccountService.findCurrentBankAccountAsDefaultInvoice(companyService.findCompanyByUser(users));
 

Jeżeli dane są w bazie to zwracają obiekt, jeżeli nie ma ich w bazie.. no właśnie i tu mam problem. Jak uwzględnić taką sytuację ?
Na tym obiekcie wykonuję dużo operacji, ale jak jest w bazie danych. Jeżeli go nie ma to mam taki komunikat:

Caused by:

java.util.NoSuchElementException
at java.util.ArrayList$Itr.next(ArrayList.java:834)
at java.util.Collections$UnmodifiableCollection$1.next(Collections.java:1067)
at org.springframework.data.jpa.repository.query.CriteriaQueryParameterBinder.bind(CriteriaQueryParameterBinder.java:63)
at org.springframework.data.jpa.repository.query.ParameterBinder.bind(ParameterBinder.java:111)
at org.springframework.data.jpa.repository.query.ParameterBinder.bindAndPrepare(ParameterBinder.java:172)

0

Może daj tą metodę w bloku try/catch i jak nie będzie danych zwracaj null. Niech ktoś bardziej doświadczony się wypowie jak to powinno się zrobić prawidłowo.

szarotka
  • Rejestracja:ponad 9 lat
  • Ostatnio:13 dni
  • Postów:533
1

obsłużyć wyjątek tzn. try catch (NoSuchElementException e)
ale wpierw zastanowić się czy taka sytuacja - brak danych jest dopuszczalna przez twój system i czy w przypadku braku danej np. ma przerywać działanie i wysyłać komunikat do użytkownika ...

0

Nie możesz użyć Optionala?

PA
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad 8 lat
  • Postów:80
0

co to Optional ? O try catch myślałem ale raczej wolał bym inne rozwiązanie bo w tym przypadku to raczej będzie typowa sytuacja kiedy dane jeszcze do bazy nie były wprowadzane.

Dzięki
@szarotka
@zimny Lew
@Noonesd

W0
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 7 godzin
  • Postów:3584
0

Coś mi tu nie pasuje, obsługa NoSuchElementException to chyba łatanie, a nie rozwiązanie.

Generalnie - problem bierze się stąd, że przy budowaniu - najprawdopodobniej - wywołania hibernate próbuje wziąć obiekt i wstawić go do query. Ponieważ obiektu nie ma, to go wstawić nie może.

Tak jak tutaj zasugerowano rozbij na dwa i skorzystaj z Optionala:

Kopiuj
	Optional.ofNullable(companyService.findCompanyByUser(users))
		.ifPresent(bankAccountService::findCurrentBankAccountAsDefaultInvoice);

Taka linijka jest równa (funkcjonalnie, nie z poziomu JVM):

Kopiuj
	Company company = companyService.findCompanyByUser(users);
	if(company != null){
		bankAccountService.findCurrentBankAccountAsDefaultInvoice(company);
	}
PA
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad 8 lat
  • Postów:80
0

@wartek01 dzięki.

W tym przypadku Company zawsze istnieje. Chodzi o to, że findCurrentBankAccountAsDefaultInvoice nie będzie miało wyników wyszukiwania bo po prostu BankAccount nie został ustawiony jako Defaultowy. Zapytanie to ma zwracać obiekt z konkretnym warunkiem. Tylko, że raz ten warunek jest spełniony - zapytanie będzie miało rezultat a drugim razem warunek nie będzie spełniony co powoduje brak rezultatów.

Też tak mi się wydaje, że try catch to pewnego rodzaju łatanie... :) ale działa :) Ale to nie ma tylko działać.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.