0

查询数据库并根据 entity.fieldA 对结果集进行排序时遇到问题。

例如,在学校环境中(学生、教师)。我有很多学生的老师。

//Student class
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TEACHER_ID")
private Teacher teacher;

我希望我的查询按teacher.name 排序,但只有老师可以从我这里获得。

所以有查询:

FROM Student s ORDER BY s.teacher;

即使我对老师实施可比性,它也不起作用:

@Override
public int compareTo(Teacher o) {
  return getName().compareTo(o.getName());
}

我的查询:

from Student a left join fetch a.teacher where a.xid=:xxx ORDER BY a.teacher ASC

我有一个框架,这就是为什么我无法按 a.teacher.name 排序的原因,所以我问是否即使使用 a.teacher 并实现 Comparable 接口,也可以实现按 a.teacher.name 排序。

这个问题来自延迟加载的数据表,当您单击实体列进行排序时,它只会给您实体名称而不是字段。

任何想法?

4

2 回答 2

0

我能够通过动态列和运行时添加 sortBy 属性来解决这个问题:

<c:if test="#{sort}">
    <c:if test="#{empty childField}">
        <f:attribute name="sortBy" value="#{field}" />
    </c:if>
    <c:if test="#{not empty childField}">
        <f:attribute name="sortBy" value="#{field}.#{childField}" />
    </c:if>
</c:if>

因此,如果 childField 未设置,则代码的作用是按字段排序。否则,如果它是一个像teacher 这样的实体,它会将该实体的属性设置为排序字段,在我们的例子中是teacher.name。

于 2013-05-13T02:08:09.273 回答
0

HQL 查询被转换为 SQL 查询并由您的数据库执行。而且您的数据库不知道也不关心您的类及其compareTo()方法。

您只需要

select s from Student s order by s.teacher.name

阅读有关 HQL 的文档以了解联接的工作原理。

于 2013-05-10T15:43:19.577 回答