gpt4 book ai didi

java - CriteriaQuery 与 OrderBy 和 MaxResult 仅返回非 NULL 行

转载 作者:行者123 更新时间:2023-11-30 05:36:10 27 4
gpt4 key购买 nike

我有一个实体表,我想通过 CriteriaQuery.orderBy 进行排序并使用 setFirstResult 和 setMaxResults 限制结果。 orderBy 位于连接属性上。如果有 200 个项目,并且我 setMaxResults(100),则仅返回具有非 NULL 值的行。

例如,假设我有 200 个 Group 行,其中 50 个具有 Group.roles 值,其余行没有值。如果我 setMaxResults(100) 我只会得到 50。这会破坏从更高级别代码调用此查询的 Vaadin 框架,因为它知道(通过单独的查询)有 200 个条目,但只返回 100 个条目,因此它会重复运行相同的查询来尝试获取所有 200 个条目。

这是我的大致代码:

@Entity()
@Table(uniqueConstraints = { @UniqueConstraint(columnNames = { "ID" }) }, name = "T_Group")
public class Group {
@Basic()
@Column(name = "Name")
private String name = null;

@ManyToMany(cascade = { CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH }, fetch = FetchType.EAGER)
@JoinTable(joinColumns = { @JoinColumn(name = "Group_id") }, inverseJoinColumns = {
@JoinColumn(name = "Role_id") }, name = "Group_Roles")
private List<Role> roles = new ArrayList<Role>();
}

@Entity()
@Table(uniqueConstraints = { @UniqueConstraint(columnNames = { "Name" }),
@UniqueConstraint(columnNames = { "iD" }) }, name = "T_Role")
public class Role {
@Basic()
@Column(name = "ID")
private String iD = null;

@Basic()
@Column(name = "Name")
private String name = null;
}

public List<Group> query() {
String property = "roles";
int offset = 0;
int limit = 100;
boolean ascending = false;

EntityManager em = ...;
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<?> criteriaQuery = builder.createQuery(CertificatePolicy.class);
Root<CertificatePolicy> root = criteriaQuery.from(CertificatePolicy.class);
List<Order> orders = new ArrayList<>();

Join<Group, Role> join = root.join("roles");
Expression<?> path = join.get("name");
orders.add( ascending ? builder.asc(path) ? builder.desc(path) );
criteriaQuery.select(root);
criteriaQuery.orderBy(orders);
List<CertificatePolicy> items = em.createQuery(criteriaQuery)
.setFirstResult(offset).setMaxResults(limit).getResultlList();
return items;
}

使用 hibernate 5.4.3.Final

最佳答案

加入组和角色实体时,您应该指定 LEFT JOIN 作为加入类型。

Join<Group, Role> join = root.join("roles", JoinType.LEFT);

关于java - CriteriaQuery 与 OrderBy 和 MaxResult 仅返回非 NULL 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56571200/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com