【问题标题】:JPA query with subselect带有子选择的 JPA 查询
【发布时间】:2019-10-25 08:43:56
【问题描述】:

我想表达以下查询

select * from(
            select pI, max(pAs) as pAs from mytable
            and pAs>=?1 and pAs<=?2
            and pI like 'DE%%'
            and pE like ?6
            group by pI
            ) as x
            inner join mytable as a
            on a.pI=x.pI
            and a.pAs=x.pAs

使用休眠中的标准构建器。我没有成功,到目前为止,我使用的是 nativeQuery。

但是,问题的症结(我无法解决)似乎是我需要在子选择中返回两个属性。我发现的所有示例都只返回一个属性。

这真的是 jpa/hibernate 的限制还是有办法做我想做的事? 任何帮助/指针表示赞赏。

【问题讨论】:

  • 首先你需要实体
  • 当SQL语句做你想做的事情时,你为什么要使用Criteria API
  • @alexvaluiskyi 我确实有一个用于最终查询的实体。拥有“临时”实体是否允许我从子选择中返回多个属性?你碰巧有一个可行的例子吗?
  • 您想获取子选择属性作为查询结果吗?还是仅在使用 in 子句时才需要它?
  • @alexvaluiskyi 在这种情况下,我真的只需要它们来进行自加入。

标签: jpa


【解决方案1】:

您没有提供有关您的实体的任何信息。所以我怀疑你有Mytable实体类,它有Long字段pAs

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Mytable> query = builder.createQuery(Mytable.class);
Root<Mytable> root = query.from(Mytable.class);

Subquery<Long> subquery = query.subquery(Long.class); // max(pAs)
Root<Mytable> subRoot = subquery.from(Mytable.class);

Predicate predicate1 = 
         builder.equal(root.get("pI"), subRoot.get("pI"));

Predicate predicate2 = 
         builder.greaterThan(subRoot.get("pAs"), 0);

Predicate predicate3 = 
         builder.lessThan(subRoot.get("pAs"), 100);

//There is a simple example. But you can add as many predicates as you need
Predicate fullPredicate = 
         builder.and(predicate1, predicate2, predicate3);

Predicate havingPredicate = 
         builder.equal(root.get("pAs"), builder.max(subRoot.get("pAs")));

subquery.select(builder.max(subRoot.get("pAs"))).where(fullPredicate)
    .groupBy(subRoot.get("pI")).having(havingPredicate);

query.select(root).where(builder.exists(subquery));

List<Mytable> result = entityManager.createQuery(query).getResultList();

【讨论】:

    猜你喜欢
    • 2011-07-05
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    相关资源
    最近更新 更多