如何在 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 包含 id 和 studentName 属性的映射。
我的数据库结构如下所示:
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 的条件中使用多对多关联中的索引列?的主要内容,如果未能解决你的问题,请参考以下文章