CriteriaQuery JPA 2 问题与结果

Posted

技术标签:

【中文标题】CriteriaQuery JPA 2 问题与结果【英文标题】:CriteriaQuery JPA 2 issue with results 【发布时间】:2013-07-27 00:38:19 【问题描述】:

我正在使用 JPA 2 和 Hibernate 来构建一个查询,该查询在我的一生中都不会正确运行。如下查询:

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 的值在日期范围内时才返回结果。有人可以在这里帮忙吗。我对此感到头疼,因为我相当确定我做对了......

谢谢 韦塞尔

【问题讨论】:

也许描述您的查询应该做什么,以及您的查询而不是做什么,可能会有所帮助?你能告诉我们它产生的 SQL 吗?当您在工具中运行 SQL 时,您可以删除/更正哪些条件以给出正确的结果? 当您说“查询仅在 TC_DAR_ACTIVITY_TYPE 和 COMMENTS 的值在日期范围内时返回结果”时,ACTIVITY_TYPE 是如何具有日期范围的? 如果你没有在所有东西上都有丑陋的前缀,你的代码将是可读的。 ACTIVITY、COMMENT、ACTIVITY_TYPE 将使您和其他人能够理解的可读代码。格式化你的代码——尤其是标准——也更好。如果看不清楚,就无法理解清楚。调试的第一步,capiche? 对不起,我是 *** 的新手,我想当有人回复时我会收到通知。我现在将讨论这个.. @Thomas,该查询的第一部分有一个日期范围。因此,只有当该日期范围内的记录同时具有这两个值时,才会返回任何记录。如果没有记录同时具有两个值,则没有返回值,有意义吗? 【参考方案1】:

类型和发布路径使用规范要求的内部连接。您必须为要使用左外连接的任何连接指定连接和 joinType.LEFT。

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

【讨论】:

以上是关于CriteriaQuery JPA 2 问题与结果的主要内容,如果未能解决你的问题,请参考以下文章

按 MAX(childitem.property) 对 JPA CriteriaQuery 的排序结果

JPA 2 CriteriaQuery,使用限制

带有列表的 JPA CriteriaQuery 投影

复杂的多对多 JPA CriteriaQuery

如何将 JPA 调整为 Criteriaquery

向 JPA CriteriaQuery 添加连接