【发布时间】:2021-04-06 16:03:43
【问题描述】:
我正在使用 Spring JPA 规范进行查询,但无法实现与订购相关的用例。请注意,由于某种原因,我被规范卡住了,无法切换到 JPQL。
这是修剪后的域模型:
@Entity
public class Employee {
@Id
@GeneratedValue
private long id;
private String name;
@OneToMany(mappedBy = "employee", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<Phone> phones; //contains both "active" & "inactive" phones
}
@Entity
public class Phone {
@Id
@GeneratedValue
private long id;
private boolean active;
private String number;
@ManyToOne(fetch = FetchType.LAZY)
private Employee employee;
}
我需要根据他们拥有的活动电话数量来拉动所有员工并订购他们。我已经使用了代码-
List<Order> orders = new ArrayList<>();
orders.add(cb.desc(cb.size(employee.get("phones"))));
cq.orderBy(orders);
当我运行代码时,被执行的查询有
ORDER BY (SELECT
COUNT(phone4_.employee_id)
FROM
phone phone4_
WHERE
employee4_.id = phone4_.employee_id) DESC
我尝试了很多方法,但无法向仅检查 “活动” 电话的 WHERE 逻辑添加另一个条件。请提出建议。
更新:
我做了一些研究并尝试了以下方法来实现用例。但是,我收到错误 - “org.hibernate.hql.internal.ast.QuerySyntaxException:意外的 AST 节点:查询”
Subquery<Long> subquery = cq.subquery(Long.class);
Root<Phone> phRoot= subquery.from(Phone.class);
Predicate p1 = cb.equal(root.get("id"), phRoot.get("employee").get("id"));
Predicate p2 = cb.isTrue(phRoot.get("active"));
cq.distinct(true);
List<Order> orders = new ArrayList<>();
orders.add(cb.desc(subquery.select(cb.count(phRoot.get(ID))).where(p1, p2)));
【问题讨论】:
标签: java spring spring-boot jpa spring-data-jpa