hibernate标准一个域、多个域和列表

hibernate标准一个域、多个域和列表,hibernate,criteria,Hibernate,Criteria,我有三个实体ClassA、ClassB和ClassC ClassA { ... @Id @GeneratedValue @Column(name = "a_id") private long id; ... @OneToMany(cascade={CascadeType.ALL}) @JoinColumn(name="a_id") private List<ClassB> bbb; ... } ClassB { ... @ManyToOne private

我有三个实体ClassA、ClassB和ClassC

ClassA {
 ...
 @Id
 @GeneratedValue
 @Column(name = "a_id")
 private long id;
 ...
 @OneToMany(cascade={CascadeType.ALL})
 @JoinColumn(name="a_id")
 private List<ClassB> bbb;
 ...
}

ClassB {
 ...
 @ManyToOne
 private ClassC ccc;
 ...
}

ClassC {
 ...
 private String name;
 ...
}

我将非常感谢您的帮助。

您需要使用别名来嵌套限制:

criteria.createAlias("bbb", "bbb", CriteriaSpecification.LEFT_JOIN);
criteria.createAlias("bbb_ccc", "bbb.ccc", CriteriaSpecification.LEFT_JOIN);
criteria.add(Restrictions.ilike("bbb_ccc.name", name, MatchMode.ANYWHERE));

这将过滤实体aaa上的结果,但实际上不会获取关联实体(bbb和ccc)。要获取这些实体,最简单的方法是将映射注释参数设置为FetchMode.EAGER。但是,您也可以在代码中根据每个查询动态执行此操作。

您需要使用别名来嵌套限制:

criteria.createAlias("bbb", "bbb", CriteriaSpecification.LEFT_JOIN);
criteria.createAlias("bbb_ccc", "bbb.ccc", CriteriaSpecification.LEFT_JOIN);
criteria.add(Restrictions.ilike("bbb_ccc.name", name, MatchMode.ANYWHERE));

这将过滤实体aaa上的结果,但实际上不会获取关联实体(bbb和ccc)。要获取这些实体,最简单的方法是将映射注释参数设置为FetchMode.EAGER。但是您也可以在代码中根据每个查询动态地执行此操作。

现在不推荐使用CriteriaSpecification.LEFT\u JOIN,因此您可以使用
org.hibernate.sql.JoinType.LEFT\u OUTER\u JOIN

criteria.createAlias(“bbb”,“bbb”,JoinType.LEFT\u OUTER\u JOIN);
createAlias(“bbb_ccc”,“bbb.ccc”,JoinType.LEFT_OUTER_JOIN);

添加(Restrictions.ilike(“bbb_ccc.name”、name、MatchMode.ANYWHERE))

现在不推荐使用CriteriaSpecification.LEFT\u JOIN,因此您可以使用
org.hibernate.sql.JoinType.LEFT\u-OUTER\u JOIN

criteria.createAlias(“bbb”,“bbb”,JoinType.LEFT\u OUTER\u JOIN);
createAlias(“bbb_ccc”,“bbb.ccc”,JoinType.LEFT_OUTER_JOIN);

添加(Restrictions.ilike(“bbb_ccc.name”、name、MatchMode.ANYWHERE))

现在不推荐使用带有CriteriaSpecification的createAlias方法现在不推荐使用带有CriteriaSpecification的createAlias方法