如何对hibernate

时间:2017-02-17 04:13:27

标签: hibernate hibernate-criteria

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

1 个答案:

答案 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的其他查询的错误结果。