如何在休眠的两个加入实体上应用限制


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颜色的ItemS。

请注意,当启用过滤器时,它在会话的持续时间内仍然有效。

有时对此类查询进行专门启用过滤器并在检索结果后立即将其禁用以免其他查询结果对Category的其他查询结果。

,这是有用的

最新更新