CriteriaBuilder, CriteriaQuery.. dlaczego tak skomplikowano tworzenie query?

0

Chciałem sobie wybrać rekordy Expense z tabeli za pomoca Hibernate.. jak wygląda zapytanie? tak:

   LocalDateTime startDateTime = ...
   LocalDateTime endDateTime = ...
		
   CriteriaBuilder builder = sessionFactory.getCurrentSession().getCriteriaBuilder();
   CriteriaQuery<Long> criteriaQuery = builder.createQuery(Long.class);
   Root<Expense> root = criteriaQuery.from(Expense.class);
   criteriaQuery.select(builder.count(root));
   builder.between(root.get("date").as(LocalDateTime.class), startDateTime, endDateTime);

Mógłby mi ktoś wytłumaczyć dlaczego niektóre elementy składania zapytań znajduja sie w criteriaQuery(tj. select), a niektóre w CriteriaBuilderze(np. between)? Nie można było tego zrobić w jednej klasie? Może to ma jakiś sens, którego nie potrafię dostrzec? We wcześniejszych wersjach wystarczyło zrobić

criteria.add(Restriction.ge(startDateTime));
criteria.add(Restriction.le(endDateTime()):

i wykonać zapytanie.. a teraz?

0

Bo tak zrobili i tego nie zmienisz. Na szczęście na ogół wykorzystujemy JPQL które jest proste.. niczym SQL ;)

0

w takim razie po co tak utrudniać życie programisty? Nowe wersje powinny być chyba łatwiejsze w użyciu, na tym chyba polegają udoskonalenia? ;)

0

Nie wiem, pytaj twórców standardu JPA ;)
Hibernate miało swoje Criteria API to dostowali w 5 do API JPA ;)

0

Ładniej można przez querydsl. To framework wspierany przez Spring Data JPA. Przykładowe query:

List<Person> persons = queryFactory.selectFrom(person)
  .where(
    person.firstName.eq("John"),
    person.lastName.eq("Doe"))
  .fetch();

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