首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从复杂的SQL查询构建CriteriaQuery

从复杂的SQL查询构建CriteriaQuery
EN

Stack Overflow用户
提问于 2020-01-16 23:38:05
回答 2查看 129关注 0票数 0

我是标准API的新手,正在努力从这个简单的SQL构建CriteriaQuery:

代码语言:javascript
复制
SELECT * 
FROM user_acc u 
WHERE (SELECT count(b) FROM bonus b WHERE b.employee_id = u.id) > 8;

有人能帮我吗?我很困惑..。

EN

回答 2

Stack Overflow用户

发布于 2020-01-16 23:47:49

您可以在包含HAVING子句的SELECTGROUP BY列表中列出所有需要的非聚合列:

代码语言:javascript
复制
SELECT b.br, b.employee_id 
  FROM user_acc u 
  JOIN bonus b ON b.employee_id = u.id
 GROUP BY b.br, b.employee_id 
HAVING count(b.br) > 8;
票数 0
EN

Stack Overflow用户

发布于 2020-01-17 17:55:15

您需要实体才能使用Criteria API

代码语言:javascript
复制
@Entity
@Table(name = "user_acc")
public class UserAcc{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    // getters setters
}

@Entity
@Table(name = "employee")
public class Employee{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    // getters setters
}

@Entity
@Table(name = "bonus")
public class Bonus{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @ManyToOne
    @JoinColumn(name = "employee_id")
    Employee employee;

    // getters setters
}

然后,您可以使用以下代码

代码语言:javascript
复制
public List<UserAcc> getUserAccs(EntityManager em) {
        CriteriaBuilder builder = em.getCriteriaBuilder();
        CriteriaQuery<UserAcc> query = builder.createQuery(UserAcc.class);
        Root<UserAcc> user = query.from(UserAcc.class);

        Subquery<Bonus> subquery = query.subquery(Bonus.class);
        Root<Bonus> bonus = subquery.from(Bonus.class);
        Path<Long> employeeId = bonus.get("employee").get("id");

        Predicate subqueryPredicate = builder.equal(user.get("id"), employeeId);            
        Expression<Long> bonusCount = builder.count(bonus);

        subquery.select(bonusCount)
                .where(subqueryPredicate)
                .groupBy(employeeId)
                .having(builder.greaterThan(bonusCount, 8L);

        Predicate predicate = builder.exists(subquery);
        query.select(user).where(predicate);

        return em.createQuery(query).getResultList();
} 

最终查询略有不同,但结果应该与预期一致。

我使用文本编辑器编写了此代码,因此需要对其进行测试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59773103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档