2013-07-27 3 views
0

Я использую JPA 2 с Hibernate, чтобы построить запрос, который на всю жизнь меня не будет работать корректно. Запрос ниже:CriteriaQuery JPA 2 проблема с результатами

public Integer getCountForDAR(Date _SD, Date _ED, Integer _PostId, String _Filter) { 

     CriteriaBuilder cb = getEm().getCriteriaBuilder(); 
     CriteriaQuery cq = cb.createQuery(TcDarActivities.class);   
     Root fromTcDarActivities = cq.from(TcDarActivities.class); 

     Path typePath = fromTcDarActivities.get(BaseDao.TC_DAR_ACTIVITY_TYPE).get(BaseDao.TYPE_NAME); 
     Path postPath = fromTcDarActivities.get(BaseDao.TC_POST).get(BaseDao.POST_ID); 

     cq.select(fromTcDarActivities).where(
       cb.and(cb.between(fromTcDarActivities.get(BaseDao.DARACTIVITY_TIME), _SD, _ED), 
       cb.equal(postPath, _PostId), 
       cb.or(
       cb.like(fromTcDarActivities.get(BaseDao.COMMENTS), _Filter), 
       cb.like(typePath, _Filter) 
       ))); 

     TypedQuery tq = getEm().createQuery(cq); 
     LOGGER.info(tq.unwrap(org.hibernate.Query.class).getQueryString()); 

     try 
     { 
      List<TcDarActivities> list = getEm().createQuery(cq).setHint("javax.persistence.cache.retrieveMode", CacheRetrieveMode.BYPASS).getResultList(); 
      return list.size(); 
     } 
     catch(Exception e) { return 0; } 
    } 

Поле TC_DAR_ACTIVITY_TYPE может быть пустым в базе данных. Проблема заключается в том, что запрос возвращает результаты только в том случае, если значения TC_DAR_ACTIVITY_TYPE и COMMENTS имеют значения в диапазоне дат. Может кто-то может помочь здесь. Я растрескивание голову на это, потому что я абсолютно уверен, что я делаю это правильно ...

Благодаря Вессель

+0

Возможно, описание того, что должен сделать ваш запрос *, и что ваш запрос будет * вместо этого, может помочь? Можете ли вы показать нам SQL, который он производит? Когда вы запускаете SQL в инструменте, какие условия вы можете удалить/исправить, чтобы дать правильные результаты? –

+0

Когда вы говорите: «Запрос возвращает результаты, если TC_DAR_ACTIVITY_TYPE и COMMENTS имеют значения в диапазоне дат», как ACTIVITY_TYPE имеет диапазон дат? –

+0

Ваш код был бы читабельным, если бы у вас не было всех уродливых префиксов на все. ACTIVITY, COMMENT, ACTIVITY_TYPE сделает читаемый код, который вы и другие люди могли бы понять. Отформатируйте свой код - особенно - лучше. Если он не может быть ясно прочитан, его нельзя понять ясно. Первый шаг в отладке, capiche? –

ответ

0

Тип и пост путь использует внутренние соединения соответствии со спецификацией. Вы должны указать join и joinType.LEFT для любых объединений, для которых вы хотите использовать левые внешние соединения.

FromTcDarActivities.join(BaseDao.TC_DAR_ACTIVITY_TYPE, JoinType.LEFT).get(BaseDao.TYPE_NAME); 
+0

Gotcha, я дам ему попытку и дам вам знать ... –

Смежные вопросы