java - 标准:如何获得没有父母的孩子
问题描述
我对 Netbeans 上的 Criteria 和 Hibernate 有一点问题。
可以为我服务的解决方案有几个:在 Netbeans 中使用元模型(它是我所有问题的解决方案,但控制台经常吐出一个错误,说它找不到源),或者执行查询所需的代码。
情况如下:我有一个名为 Grado 的父实体和一个名为 Materia 的子实体。这种关系是一对多的。一个 Grado 可以有几个 Materias:英语、数学、物理、伦理学......
我需要做一个或几个查询来获取材料列表而不分配父母。我试图获得的 SQL 中的等价物是:SELECT * FROM Materia where id not in (select id from Materia m join grado_materia g on m.id = g.materias_id);
Grado父实体:
@Entity
public class Grado implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Basic
private String nombre;
@OneToMany(orphanRemoval = true)
private List<Materia> materias;
//getters and setters
}
Materia子实体
@Entity
public class Materia implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Basic(optional = false)
private String nombre;
//getters and setters
}
Hibernate 生成以下关系 grado -> grado_materia <- materia
编辑 为了完成@Spiderman 为我遇到的问题提供的解决方案,我为未来的读者提出了查询
CriteriaBuilder cb = sesion.getCriteriaBuilder();
CriteriaQuery<Materia> cq = cb.createQuery(Materia.class);
Root<Materia> root = cq.from(Materia.class);
cq.select(root);
cq.where(root.get("grado").isNull());
Query query = sesion.createQuery(cq);
List<Materia> results = query.getResultList();
解决方案
尝试以下操作:
到 Grado 模型添加
@OneToMany(orphanRemoval = true)
@JoinColumn(name="grado_id")
private List<Materia> materias;
和材料模型添加
@ManyToOne
private Grado grado ;
将上述内容添加到 Materia 模型将阻止创建连接表。
推荐阅读
- ios - 有什么办法可以摆脱带有情节提要的短 ViewController 吗?
- python - 如何告诉 sublime text 我想使用哪个 virtualenv
- java - 如何使用 GraalVM native-image 修复“尝试避免初始化导致初始化的类”
- java - 如何在 Fragment 中使用 getSharedPreferences?
- mysql - 如何在 GCP MYSQL 中实现高可用性?
- c - BPF:“bpf_obj_get_info_by_fd”因“无效参数”而失败
- qml - Squish 得到错误的 QML 类型(基本类型而不是实际类型)
- sql-server - 在 SQL Server 中创建一个存储过程,该过程返回表中的列总数和每列中不同的值计数
- angular - rxjs merge.complete() 会关闭对其所有输入流的订阅吗?
- asp.net-core - Asp .NET Core 使用资源中的字符串作为图像 src 路径