设置属性的HQL查询

时间:2011-05-03 13:58:19

标签: hibernate hql hbm

假设我有以下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

然而,hibernate抛出以下异常:

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]

是否可以运行基于Set属性返回结果的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;

2 个答案:

答案 0 :(得分:3)

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

以下是我的理由:classes是一个Set,因此没有className属性。一旦使用连接遍历关系,就会在myClass实体上获得一个别名,该实体具有className属性。

注意:Java中的类应始终以大写字母开头。将myClass重命名为MyClass

答案 1 :(得分:0)

  

是否可以运行一个hibernatequery,它根据Set的属性返回结果?

是!

  

在上面的例子中

我们确定org.myCompany.myClassclassName属性吗? 如果是,请尝试这样的事情 select count(*) from Student s inner join Classes c where c.className = :myClassName