Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从复杂SQL查询构建CriteriaQuery_Java_Sql_Jpa_Criteria - Fatal编程技术网

Java 从复杂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

我是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 
  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应该是结果的一部分吗?