我正在使用Hibernate 3.5,我正在尝试进行搜索,该搜索将返回包含关键字的父对象,或者如果其中一个子对象包含关键字,则返回父项。
以下是使用Hibernate Documentation中的Cat的示例:
@Entity
@Table(name="cats")
public class Cat {
private String name;
private Set<Cat> kittens;
}
以下是Criteria Query部分的示例查询:
Criteria criteria = session.createCriteria(Cat.class)
.add(Restrictions.like("name", "F%")
.createAlias("kittens", "kits")
.addRestrictions.like("kits.name", "F%");
List<Cat> cats = criteria.list();
这将仅返回Cat对象,其中父对象的名称以F开头,其中一只小猫的名称以F开头。我想创建一个查询以返回这些限制的逻辑分离。名字以F或Cats开头的猫,其小猫的名字以F开头。 示例:(猫:[小猫]) 弗里茨:[],弗兰克:[艾尔,巴里],查理:[弗兰];应该都包含在结果集中。 而鲍勃:[]和迈克:[艾伦,博斯科]不应该。
我尝试了一些不同的查询,但无法获得正确的结果。
Criteria criteria = session.createCritera(Cat.class)
.add(Restrictions.like("name", "F%);
此查询返回名称以F开头的所有Parent Cats。
Criteria criteria = session.createCriteria(Cat.class)
.createAlias("kittens", "kits")
.add(Restrictions.like("kits.name", "F%");
此查询返回所有拥有名称以F开头的小猫的父猫。 这是我的麻烦开始的地方,我需要这两组的分离。首先我试过了:
Criteria.criteria = session.createCriteria(Cat.class)
.createAlias("kittens", "kits")
.add(Restrictions.disjunction()
.add(Restrictions.like("name", "F%")
.add(Restrictions.like("kits.name", "F%");
此查询不起作用。它只返回其子项的名称以F开头的父项,就像上一个查询一样。
Criteria.criteria = session.createCriteria(Cat.class)
.createAlias("kittens", "kits")
.add(Restrictions.or(
Restrictions.like("name", "F%"),
Restrictions.like("kits.name", "F%"));
如果我正确阅读API文档,则此查询与上一个查询相同。这是有道理的,因为我得到与前两个查询相同的结果。
通过标准搜索,我很难以获得正确的Cats集。
我想我可以运行两个单独的查询然后清理生成的集合,但这似乎是不必要的优雅。
任何建议表示赞赏。 喵。
答案 0 :(得分:1)
尝试:
Criteria.criteria = session.createCriteria(Cat.class)
.createAlias("kittens", "kits", Criteria.LEFT_JOIN)
.add(Restrictions.or(
Restrictions.like("name", "F%"),
Restrictions.like("kits.name", "F%"));
这应该有效。