查找集合中具有两个特定条目的实体

时间:2016-04-16 16:45:34

标签: java hibernate

这对谷歌来说真的很难,所以我会在这里试试运气。

我有两个这样的课程:

@Entity
public class Cat {
    @Id
    private Integer catId;

    private String name;

    private String color;

    @OneToMany
    private List<Kitten> kittens;
}

@Entity
public class Kitten {
    @Id
    private Integer kittenId;

    private String name;

    private String color;

    @ManyToOne
    private Cat parent;
}

我希望找到所有灰色Cat,其中Kitten的名称以P开头且是白色的,而另一只小猫的名字以Q开头且为黑色。到目前为止,我有这个:

Criteria criteria = session.createCriteria(Cat.class);
criteria.add(Restriction.eq("color", "grey"));

criteria.createAlias("kittens", "k");

criteria.add(Restriction.and(
    Restriction.eq("k.color", "white"),
    Restriction.ilike("k.name", "P%")
    ));
criteria.add(Restriction.and(
    Restriction.eq("k.color", "black"),
    Restriction.ilike("k.name", "Q%")
    ));

List<Cat> results = criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();

现在这不起作用,即使存在这样的Cat也没有给我任何打击。删除最后一个限制集工作正常。我想我需要一种不同的方法,而不仅仅是为第二个Kitten添加另一个限制,但我还没弄清楚我想要做什么。

同样重要的是,我不能将Cat与四只具有这些属性之一的小猫相匹配。

2 个答案:

答案 0 :(得分:1)

在添加第二个限制后你无法获取的原因是你告诉标准找到一个具有所有这些限制的小猫:黑色和白色 - 当然除非它是shrodinger的猫,否则它们不存在。

你可以通过两只小猫加入猫来实现这个目的:为小猫创建两个别名:k1,k2并限制第一只小猫的第一只小猫和第二只小猫的第二只。

答案 1 :(得分:0)

基于评论的新答案:

在SQL中我认为这样的事情会起作用。我不知道Hibernate,但您可以将此作为将概念转换为代码的起点。

Select 
C.name, count(distinct K.color)
From Cat C, Kitten K
Where
C.color = 'grey'
and C.id = K.catId
and (
  (K.color = 'white' and K.name like 'P%') 
  or 
  (K.color = 'black' and K.name like 'Q%')
)
group by C.name
having count(distinct K.color) = 2

首先加入符合条件的小猫的符合条件的猫。本身并没有解决问题(由下面的旧内容和评论链证明),但是如果你添加一个分组来计算每只猫发现的不同小猫颜色的数量,如果它等于2,则意味着猫有一只小猫。

请参阅我用来测试它的SQLFiddle:http://sqlfiddle.com/#!9/ee93f5/1/0

旧内容(保留以便评论有意义):

我不知道hibernate,但我认为SQL应该是这样的:

Select <your stuff>
From Cat C, Kitten K
Where
C.color = 'grey'
and C.id = K.catId (I guess Hibernate provides these keys automatically?)
and (
  (K.color = 'white' and K.name like 'P%') 
  or 
  (K.color = 'black' and K.name like 'Q%')
)

基本上,两个小猫约束必须是OR子句的一部分,该子句作为AND子句添加到整体约束中。

在您的示例中,如果我正确理解Hibernate代码,则所有约束都将添加为AND子句,因此结果集将为空,因为您的Cat加入的任何Kitten行都不能同时为黑白时间。

相关问题