Java 从复杂SQL查询构建CriteriaQuery
我是Criteria API新手,正在努力从以下简单SQL构建CriteriaQuery:Java 从复杂SQL查询构建CriteriaQuery,java,sql,jpa,criteria,Java,Sql,Jpa,Criteria,我是Criteria API新手,正在努力从以下简单SQL构建CriteriaQuery: SELECT * FROM user_acc u WHERE (SELECT count(b) FROM bonus b WHERE b.employee_id = u.id) > 8; 有人能帮我吗?我很困惑…您可以在SELECT和groupby列表中列出所有需要的非聚合列,其中包含HAVING子句: SELECT b.br, b.employee_id FROM user_acc u
SELECT *
FROM user_acc u
WHERE (SELECT count(b) FROM bonus b WHERE b.employee_id = u.id) > 8;
有人能帮我吗?我很困惑…您可以在
SELECT
和groupby
列表中列出所有需要的非聚合列,其中包含HAVING
子句:
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;
您需要实体来使用标准API
@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
}
那么你可以用这个
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();
}
公共列表getUserAccs(EntityManager em){
CriteriaBuilder=em.getCriteriaBuilder();
CriteriaQuery=builder.createQuery(UserAcc.class);
Root用户=query.from(UserAcc.class);
Subquery Subquery=query.Subquery(Bonus.class);
Root bonus=子查询.from(bonus.class);
路径employeeId=bonus.get(“员工”).get(“id”);
谓词subqueryPredicate=builder.equal(user.get(“id”),employeeId);
表达式bonusCount=builder.count(奖金);
subquery.select(bonusCount)
.其中(子查询预测)
.groupBy(雇员ID)
.具有(建筑商)大于(博努斯山,8L);
谓词=builder.exists(子查询);
查询。选择(用户)。其中(谓词);
返回em.createQuery(query.getResultList();
}
最终的查询有点不同,但结果应该和预期的一样
我使用文本编辑器编写了这段代码,因此需要对其进行测试。b.br应该是结果的一部分吗?