hibernate - 设置属性的 HQL 查询

标签 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]

是否可以运行一个基于集合属性返回结果的 hibernate 查询?在上面的示例中,我们可能想要查询所有正在学习“代数 I”或其他类(class)的学生?

编辑:我启用了适当的 Debug模式以使 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;

最佳答案

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

我的推理如下:classes 是一个 Set,因此没有 className 属性。使用联接遍历关系后,您将获得 myClass 实体的别名,该实体具有 className 属性。

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

关于hibernate - 设置属性的 HQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5870591/

相关文章:

java - 如何在hql查询中将列的枚举类型转换为整数?

hibernate - hibernate 别名如何工作

java - 单个表的两个版本的 JPA 实体

java - 使用 hibernate 的主键违规问题?

nhibernate - 如何输出 Fluent NHibernate 创建的 HBM?

java - 如何从 *.hbm.xml 类生成 Hibernate 映射类

java - 需要帮助创建 hbm.xml

java - 引用 transient 实体时出现 Hibernate TransientObjectException

database - 如何排除 hibernate 中返回的某些列

java - 如何获得不同的结果,但在选择中返回另一列?