Zapytanie które nie ma rezultatu / Hibernate

0

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

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.

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?

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

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:

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

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

	Company company = companyService.findCompanyByUser(users);
	if(company != null){
		bankAccountService.findCurrentBankAccountAsDefaultInvoice(company);
	}
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ć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1