Jpa QueryBuilder Несколько выражений в где предложение не работает - PullRequest
9 голосов
/ 04 июля 2011

У меня проблема с созданием запросов с помощью javax.persistence.criteria.CriteriaBuilder.Я использую EclipseLink 2.1 и базу данных Oracle 10g.При создании запроса с несколькими ограничениями он будет использовать только первое ограничение, а не оба.

Вот мой код:

CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<Assignment> query = cb.createQuery(Assignment.class);
Root<Assignment> assignment = query.from(Assignment.class);

query.where(
    cb.equal(assignment.get("request"), request),
    cb.isNull(assignment.get("endDate")));

return getEm().createQuery(query).getResultList();

Произведенный запрос:

SELECT ASSX_ID, END_DATE, BEGIN_DATE, COMMENTS, 
       ASSX_OER_ASSIGNED_TO_ID, OER_OER_ID_ASSIGNED_BY, 
       ASSX_RQST_ID 
FROM TARTS.ASSIGNMENT_XREF 
WHERE (ASSX_RQST_ID = ?)

Выглядит хорошо, за исключением предложения where.Я ожидаю:

SELECT ASSX_ID, END_DATE, BEGIN_DATE, COMMENTS, 
       ASSX_OER_ASSIGNED_TO_ID, OER_OER_ID_ASSIGNED_BY, 
       ASSX_RQST_ID FROM TARTS.ASSIGNMENT_XREF 
WHERE (ASSX_RQST_ID = ? AND BEGIN_DATE IS NOT NULL)

Не имеет значения, использую ли я cb.and (arg1, arg2) или нет.Я делаю что-то неправильно?Любая помощь будет оценена.

1 Ответ

4 голосов
/ 06 июля 2011

Ваш запрос выглядит отлично.Как вы упомянули, CriteriaQuery.where(Predicate... restrictions) уже использует соединение предикатов, поэтому нет необходимости использовать cb.and ().

Единственное, что я могу себе представить:

  • ошибка в EclipseLink (попробуйте то же самое с Hibernate)
  • какая-то оптимизация, может быть endDate может никогда не быть нулевой?
  • ваш метод getEm () делает некоторые странные вещи
...