2011-05-03 61 views
3

假設我有以下HBM映射:HQL查詢上設置屬性

<class name="Student" table="student"> 
    <set name="classes" table="student_classes" cascade="none"> 
     <key column="studentId" /> 
     <many-to-many column="classId" class="org.myCompany.myClass" /> 
    </set> 
</class> 

在我的學生POJO,我有以下幾點:

private Set<myClass> classes = new HashSet<myClass>(); 
public Set<myClass> getClasses() { return classes; } 
public void setClasses(Set<myClass> classes) { this.classes = classes; } 

我想運行下面的HQL查詢:

select count(*) from Student where classes.className = :myClassName 

然而,休眠拋出以下異常:

ERROR [service-j2ee-4] PARSER.reportError(33) | Invalid path: 'classes.className' 
ERROR [service-j2ee-4] PARSER.reportError(33) | <AST>:0:0: unexpected end of subtree 
ERROR [service-j2ee-4] PARSER.reportError(33) | left-hand operand of a binary operator was null 
org.hibernate.hql.ast.QuerySyntaxException: Invalid path: 'classes.className' [select count(*) from Student where classes.className = :myClassName and 1=1] 

是否有可能運行一個hibernate查詢返回基於Set的屬性的結果?在上面的例子中,我們可能想要查詢所有正在參加「代數I」或其他課程的學生嗎?

編輯:我啓用了相應的調試模式來獲得Hibernate的輸出它的實際的SQL查詢,這裏是它生成的查詢:

select count(*) as col_0_0_ 
from student student0_, student_classes student1_, classes student2_ 

where student0_.studentId=student1_.studentId and student1_.classId=student2_.classId and student2_.className LIKE 'algebra' and 1=1; 

回答

3
select count(s.id) from Student s 
inner join s.classes clazz 
where clazz.className = :myClassName 

下面是我的原因吧:classes是一個集合,因此沒有className屬性。一旦使用連接遍歷關係,就會在myClass實體上獲得別名,該實體具有className屬性。

注意:Java中的類應始終以大寫字母開頭。將myClass重命名爲MyClass

+0

東西其實HQL不具有良好的內部連接支持(見http://www.coderanch.com/t/218169/ORM/java/Inner-Join-HQL)。我的集合包含myClass類型的對象,它具有className的屬性。我想根據那個className屬性進行查詢(而不是集合本身的屬性)。 – David 2011-05-03 14:13:12

+0

是的,它有很好的支持。您是否閱讀過您發送的帖子的答案。您不必像在SQL中那樣指定連接的on子句,因爲映射已經定義了表如何鏈接在一起。你有沒有試過我的查詢?閱讀http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#queryhql-joins – 2011-05-03 14:24:27

+0

我剛剛試過你的查詢,並得到了錯誤:「加入路徑預期!無效的路徑:clazz .className「 – David 2011-05-03 14:36:01

0

Is it possible to run a hibernatequery which returns results based on properties of a Set?

是的!

In the above example

我們確定org.myCompany.myClass ha a className property? 如果是,嘗試這樣 select count(*) from Student s inner join Classes c where c.className = :myClassName

+0

當我更仔細地查看我的實際查詢時,我錯過了「c」。 className之前的別名(拋出錯誤)。但是,我現在從查詢中獲得0個結果(而不是預期的結果數量)。 – David 2011-05-03 14:16:06

+0

我得到的結果爲零,因爲我需要將LIKE'%string%'添加到我的查詢中 – David 2011-05-03 14:29:14