如何在 Hibernate 的条件中使用多对多关联中的索引列?

Posted

技术标签:

【中文标题】如何在 Hibernate 的条件中使用多对多关联中的索引列?【英文标题】:How to use index column in many-to-many association in criteria in Hibernate? 【发布时间】:2013-08-13 14:21:01 【问题描述】:

我正在使用带有 Java 的 Hibernate 3。

我的 POJO 类如下:

Teacher.java

private long id;
private String teacherName;
private List<Student> students;
// getter-setter of all

Student.java

 private long id;
 private String studentName;

// getter-setter of both

Teacher.hbm.xml

<class name="Teacher" table="teacher_master">
    <id name="id" column="id" type="long">
        <generator class="native"></generator>
    </id>

    <property column="teacher_name" name="teacherName" type="string" />

    <list name="students" cascade="refresh">
        <key column="teacher_id"/>
        <index column="student_position" type="integer"/>
        <one-to-many class="Student"/>
    </list>
</class>

Student.hbm.xml 包含 idstudentName 属性的映射。

我的数据库结构如下所示:

teacher_master

id  | teacher_name
----|--------------
1   | teacher1
2   | teacher2

student_master

id  | student_name  | teacher_id  | student_position
----|---------------|-------------|------------------
1   | student1      |      1      |      0
2   | student2      |      1      |      2
3   | student3      |      1      |      1

现在我想获取所有 id = 1 的老师,按照 student_position 的顺序

我写了以下标准:

List<Long> ids = new ArrayList<Long>();
ids.add(1l);
ids.add(2l);
ids.add(3l);
Criteria criteria = session.createCriteria(Student.class);
criteria.add(Restrictions.in("id", ids));
List<Student> students = criteria.list();

这里students会按照主键1、2、3的顺序给我记录。

我希望这些记录按照它们的 student_position 的顺序排列,即 1,3,2。

我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:
     Long techId=1l;
     Criteria criteria = getSession().createCriteria(Student.class, "student");
     criteria.add(Restrictions.eq("student.teacherId", techId));
     criteria.addOrder(Order.asc("student.studentPosition"));

如果模型对象中不存在该字段,则无法使用条件查询对象。 您可以使用的另一种方法是休眠本机查询。

    Long techId=1l;
    Query query = session.createSQLQuery(
           "select * from student_master s where s.teacher_id = :teacherId order by s.student_position")
            .addEntity(Student.class)
            .setParameter("teacherId", "techId");
             List result = query.list();

【讨论】:

【参考方案2】:

您可以添加排序标准 org.hibernate.criterion.Order

criteria.addOrder( Order.asc("yourPropertyName"));

您还可以添加多个这些订单。 另请参阅 15.3 下的 here

【讨论】:

student_position 不是属性。它只是一个列,其值由 Hibernate 处理。 那么你必须把它变成一个属性。标准仅指您班级中存在的字段。 我已经知道了。但是我不能让它成为一个属性,因为它的值是由 Hibernate 处理的。 我真的看不出你不能将 student_position 添加到 Student.java 类的原因......但也许我误解了你的问题? 如果我将 student_position 添加为属性,我将提供一个范围,可以通过编程方式设置或更改其值,这是不可取的。 student_position 的值由 Hibernate 维护,我不想减少限制。

以上是关于如何在 Hibernate 的条件中使用多对多关联中的索引列?的主要内容,如果未能解决你的问题,请参考以下文章

hibernate关联关系(多对多)

hibernate的映射之三(多对多单向关联)

Hibernate 与同一实体的递归多对多关联

hibernate的映射之四(多对多双向关联)

在 Hibernate 中使用连接表初始化多对多关联

Hibernate的多对多关联关系