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でソートできるかどうかを尋ねています。

この問題は、遅延ロードされた dataTable に起因します。エンティティ列をクリックして並べ替えると、フィールドではなくエンティティ名のみが表示されます。

何か案が?

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.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 に答える