我在Netbeans上使用Criteria和Hibernate有点问题。
可以为我提供服务的解决方案有几种:使用Netbeans中的元模型(这是我所有问题的解决方案,但是控制台通常会显示一个错误,指出找不到源),或者执行查询所需的代码。
情况如下:
我有一个名为Grado的父实体,一个名为Materia的子实体。这种关系是一对多的。一个Grado可以具有几种材料:英语,数学,物理,道德...
我需要执行一个或多个查询才能获得材料列表,而无需分配父级。我尝试获取的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
}
本子实体
@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提供的solution来解决我遇到的问题,我将查询提供给将来的读者
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模型中将阻止创建联接表。