我是标准API的新手,正在努力从这个简单的SQL构建CriteriaQuery:
SELECT *
FROM user_acc u
WHERE (SELECT count(b) FROM bonus b WHERE b.employee_id = u.id) > 8;有人能帮我吗?我很困惑..。
发布于 2020-01-16 23:47:49
您可以在包含HAVING子句的SELECT和GROUP BY列表中列出所有需要的非聚合列:
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;发布于 2020-01-17 17:55:15
您需要实体才能使用Criteria 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();
} 最终查询略有不同,但结果应该与预期一致。
我使用文本编辑器编写了此代码,因此需要对其进行测试。
https://stackoverflow.com/questions/59773103
复制相似问题