2010-10-19 115 views
0

我有以下实体(不准确,但给出了一个总体思路):不同结果的读取与查询API的结果与HQL

 
@Entity 
public class WebElement implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue 
    private Long id; 

    @ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL }) 
    private Set<CoreElement> coreElements; 

    private String agent; 

    // ... omitting const' get/set hashcode equals etc. 
} 
 
public class CoreElement implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue 
    private Long id; 

    private String value; 
    // ... omitting const' get/set hashcode equals etc. 
} 

我的问题是试图使用Criteria API来获取WebElements时与HQL
当执行以下时,我得到一个空的列表。

getCurrentSession().createCriteria(WebElement.class) 
         .createCriteria("coreElements").add(
             Restrictions.eq("value", value)).list(); 

但在执行以下HQL当我得到正确的结果。

select distinct we from WebElement we, in(we.coreElements) core 
            where core.value = :inputValue 

你能帮找到我在做什么呼叫之间错误或有什么不同?
注意我的选择是与标准API工作HQLs代替。

回答

0

在你的HQL要创建一个内部联接导致Hibernate来获取这些元素

在条件查询,你可以使用FetchMode.JOIN

调用setFetchMode()由于您的查询是静态的,我会建议使用HQL - 这很容易理解,

+0

也尝试过,取模不改变结果。我用HQL离开了它,但是这个问题仍然让我感到担忧。 – Bivas 2010-10-19 15:20:21

+0

告诉我们你的代码然后... – 2010-10-19 15:45:09

0

您使用的是Restrictions.eq代替Restrictions.in()。由于您使用的HQL。

+0

in()方法是HQL short join join。这两个调用产生(几乎)相同的SQL。我改变了Criteria API与'in'一起工作,但得到了同样的无结果结果。 – Bivas 2010-10-19 14:52:53