【问题标题】:HQL to Criteria Conversion IssuesHQL 到标准的转换问题
【发布时间】:2015-04-25 11:43:43
【问题描述】:

我在将 HQL 转换为条件查询时遇到了一些问题。作为规范的一部分,我需要 Criteria 查询的返回值是 Criteria 类型,这可能不会更改。

这是我完整的 HQL 查询:

select sum(m.frequent / case when m.vigilants.size > 1 then m.vigilants.size 
else 1 end) from Museum m inner join m.vigilants v where size(m.vigilants) > 1 
and v.forename = 'Mike Jones' or size(m.vigilants) = 1 and v.forename='Mike Jones'

这是我迄今为止在获取标准查询方面的尝试

Criteria criteria = session.createCriteria(Museum.class, "m");
criteria.createAlias("m.vigilants", "v"); 
criteria.setProjection(Projections.distinct(Projections.property("m.id")));
criteria.add(Restrictions.or(Restrictions.sizeGt("vigilants", 1), Restrictions.eq("v.forename", "Mike Jones")));

老实说,我真的被卡住了,并且已经尝试了一天来让它工作,我不知道如何将这个 HQL 转换为 Criteria 查询!

【问题讨论】:

    标签: java database hibernate hql criteria


    【解决方案1】:

    在我完全正确之前,我通常必须摆弄这些东西一段时间,但这是你开始的第一步。

    另外,整个 size > 1 or size == 1 归结为 size >= 1,如果您正在执行内部连接,则这是隐含的,所以我将其省略了。

    CriteriaBuilder builder = entityManager.getCriteriaBuilder();
    CriteriaQuery<Number> query = builder.createQuery(Long.class);
    Root<Museum> root = query.from(Museum.class);
    Join<Museum, Vigilant> vigilantsJoin = root.join("vigilants");
    Predicate forenameIsMikeJones = builder.equal(vigilantsJoin.get("forename"), "Mike Joines");
    Expression<Integer> numVigilants= builder.size(root.get("vigilants"));
    Expression<Number> freqOverNumVigilants = builder.quot(root.get("frequent"), numVigilants);
    Expression<Sum> sumOfFreqOverNumVigilants = builder.sum(freqOverNumVigilants);
    query.select(sumOfFreqOverNumVigilants).where(forenameIsMikeJones);
    TypedQuery<Number> typedQuery = entityManager.createQuery(query);
    

    【讨论】:

      猜你喜欢
      • 2021-01-10
      • 1970-01-01
      • 2011-07-30
      • 2014-09-14
      • 1970-01-01
      • 1970-01-01
      • 2014-01-20
      • 2011-01-29
      • 1970-01-01
      相关资源
      最近更新 更多