class Category{
@Id
@Column(name="ID")
private Integer id;
private String name;
@OneToMany
@JoinColumn(name="CATEGORY_ID",referencedColumnName="ID")
private Set<Item> items;
}
class Item{
private Integer id;
@Column(name="CATEGORY_ID")
private Integer categoryId;
private String name;
private String color;
}
这里我有两个具有一对多关系的实体(Category&amp; Item)。
我尝试获取类别为id = 5且item color = red的项目。 我希望结果像是
{id:5,姓名:&#39;水果&#39; 项目:[{ID:3,名称:&#34;番茄&#34;颜色:红},{ID:55,名称:&#34;苹果&#34 ;, 颜色:&#34;红色&#34;}]}
Criteria c=session.createCriteria("Category.class","cat");
c.createAlias("cat.items","it");
c.add(Restrictions.eq("cat.id,5));
c.add(Restrictions.eq("it.color","red"));
List<Category> cateList=c.list();
但是,我获得了类别id = 5中的所有项目; 浪费了很多时间。需要帮助。谢谢
Category
ID NAME
1 Flower
5 Fruit
Item
ID CATEGORY_ID NAME COLOR
3 5 tomato red
55 5 apple red
4 5 banana yellow
6 5 orange orange
7 5 grape green
1 1 rose red
2 1 rose yellow
答案 0 :(得分:1)
我会看看Hibernate receive
和@Filter
注释。
您基本上想要做的是定义一个过滤器,该过滤器在颜色谓词被提取时将颜色谓词应用于集合中的条目,以便只有那些适用于集合中。
@FilterDef
您需要做的是在执行查询之前启用该过滤器:
@Entity
public class Category {
@OneToMany
@Filter(name = "itemsByColor")
private Set<Item> items;
}
@Entity
@FilterDef(name = "itemsByColor",
defaultCondition = "color = :color",
parameters = { @ParamDef(name = "color", type = String.class ) })
public class Item {
private String color;
}
现在执行您的查询:
session.enableFilter( "itemsByColor" )
.setParameter( "color", "red" );
您返回的Criteria c=session.createCriteria("Category.class","cat");
c.createAlias("cat.items","it");
c.add(Restrictions.eq("cat.id,5));
c.add(Restrictions.eq("it.color","red"));
List<Category> cateList=c.list();
个实例现在应该只包含Category
的颜色为Item
的内容。
请注意,启用过滤器后,它会在会话期间保持有效。
对于像这样的一个查询专门启用过滤器有时很有用,并在检索结果后立即禁用它,以避免针对red
的其他查询的错误结果。