gpt4 book ai didi

java - JPA Criteria 查询与 child 不工作的谓词的一对多关系

转载 作者:行者123 更新时间:2023-11-29 02:58:53 24 4
gpt4 key购买 nike

我有一个父实体

@Entity
@Table(name = "tblmodule", uniqueConstraints = {
@UniqueConstraint(columnNames = "name")
})
@SequenceGenerator(name = ACLEntityConstant.SEQ_MODULE, initialValue = 1, allocationSize = 100)
public class Module implements BaseEntity {

private static final long serialVersionUID = -4924925716441434537L;

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = ACLEntityConstant.SEQ_MODULE)
private Long id;

@Column
private String name;

@Column
private String displayName;

@OneToMany(mappedBy = "module")
@JsonManagedReference
@JsonInclude(JsonInclude.Include.NON_EMPTY)
private List<SubModule> subModule;

//getters and setters
}

Module和SubModule是一对多的关系,实体类如下

    @Entity
@Table(name = "tblsubmodule", uniqueConstraints = {
@UniqueConstraint(columnNames = {"id", "name"})
})
@SequenceGenerator(name = ACLEntityConstant.SEQ_SUBMODULE, initialValue = 1, allocationSize = 100)
public class SubModule implements BaseEntity {

private static final long serialVersionUID = 5452251016263080356L;

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = ACLEntityConstant.SEQ_SUBMODULE)
private Long id;

@Column
private String name;

@Column
private String displayName;

@ManyToOne
@JsonBackReference
@JsonInclude(JsonInclude.Include.NON_EMPTY)
private Module module;
}

我正在尝试使用条件查询查找具有子模块特定名称(“submodule1”)的模块。这是我的代码:

    CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery();
Root root = cq.from(Module.class);
cq.select(root);
ListJoin join = root.joinList("subModule");
cq.where(cb.equal(join.get("name"), "submodule1"));
cq.distinct(true);
cq.groupBy(root.get("name"));
TypedQuery query = getEntityManager().createQuery(cq);
return query.getResultList();

使用这段代码,它为我提供了模块中的所有子模块。

有没有办法只选择名称为“submodule1”的子模块?谢谢

最佳答案

您可以返回所有包含名称 = 某个值的子模块的模块,但在 JPA 中不可能获得包含从原始查询中过滤的子模块列表的“模块”实例 - JPA 需要返回托管反射(reflect)数据库状态的模块实例,以便它可以管理您可能做出的任何更改。

不是使用对象中设置的 module.submodules,而是使用类似于 "Select submodule from SubModule submodule where submodule.name = :name" 的查询直接查询子模块。然后,您可以使用结果创建基于 submodule.module 的子模块集合的映射。

关于java - JPA Criteria 查询与 child 不工作的谓词的一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36452958/

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