这里我遇到了hibernate条件使用的问题,我已经为多个表创建了条件并添加了限制,但输出并不像预期的那样
我的代码:
final Criteria crit = session2.createCriteria(Item.class, "item");
crit.createCriteria("itemvalues", "values");
crit.createCriteria("categoryitemses", "catItems");
crit.createCriteria("catItems.category", "cat");
crit.createCriteria("cat.categorytype", "catType");
crit.createCriteria("cat.categoryproducts", "catProd");
crit.createCriteria("catProd.product", "prod");
crit.createCriteria("prod.customer", "cust");
crit.add(Restrictions.eq("catType.id", id));
crit.add(Restrictions.eq("cust.id", custId));
crit.add(Restrictions.eq("values.inputkey", "previewimage"));
crit.addOrder(Order.asc("item.id"));
在Item.java中,我有以下属性
private Itemtype itemtype;
private String name;
private String description;
private Set<Itemvalue> itemvalues = new HashSet<Itemvalue>(0);
private Set<Categoryitems> categoryitemses = new HashSet<Categoryitems>(0);
ItemValue表包含一个字段名称inputkey,其中包含previewimage和content等条目,但我只需要检索预览图像输入键。
但是在输出中,输入键还带有一些其他值。
我发现hibernate生成的查询正确运行并按预期提供输出但在查询之后还有一些其他查询也在我使用set
检索itemvalue时执行final Set<Itemvalue> itemValues = itemList.get(innerIndex).getItemvalues();
final Iterator<Itemvalue> itemVals = itemValues.iterator();
while(itemVals.hasNext()) {
jobj.put("Location", itemVals.next().getValue());
}
这里的行itemValues.iterator hibernate查询执行了17次,因为总输出是17个项目,每个项目取值itemvalue但省略了之前给出的条件
crit.add(Restrictions.eq("values.inputkey", "previewimage"));
我在这里缺少什么?有人请帮我解决这个问题!
提前致谢,
卡。
答案 0 :(得分:1)
您的原始查询使用Restrictions.eq("values.inputkey", "previewimage")
限制来过滤掉Item
个对象,而不是Itemvalue
个对象。
调用getItemvalues()
时,Hibernate集合映射用于检索对象而不是原始查询。如果集合映射没有任何特殊之处,则将返回未过滤的相关项值对象集合。
您可以尝试在集合映射上配置filter,或者只为每个项目执行新条件以检索已过滤的所需itemvalue集合。