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;
}
在这里,我有两个实体(类别&amp; item)具有一对多关系。
我试图获得类别ID = 5的项目,并且项目颜色=红色。我希望结果像
{id:5,名称:'水果' 项目:[{ID:3,名称:"番茄",颜色:红色},{ID:55,名称:" Apple", 颜色:"红色"}]}
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
我会看看Hibernate @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
实例现在仅包含具有red
颜色的Item
S。
请注意,当启用过滤器时,它在会话的持续时间内仍然有效。
有时对此类查询进行专门启用过滤器并在检索结果后立即将其禁用以免其他查询结果对Category
的其他查询结果。