3

次のHBMマッピングがあるとします。

<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クエリを実行することは可能ですか?上記の例では、「代数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;
4

2 に答える 2

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

これが私がそれについて推論する方法です:はセットであり、したがってプロパティclassesを持っていません。className結合を使用して関係をトラバースすると、classNameプロパティを持つmyClassエンティティのエイリアスを取得します。

注:Javaのクラスは、常に大文字で始める必要があります。名前をに変更myClassMyClassます。

于 2011-05-03T14:06:04.127 に答える
0

セットのプロパティに基づいて結果を返すhibernatequeryを実行することは可能ですか?

はい!

上記の例では

私たちは確かorg.myCompany.myClassclassName財産を持っていますか?はいの場合は、次のようなものを試してください select count(*) from Student s inner join Classes c where c.className = :myClassName

于 2011-05-03T14:11:37.520 に答える