1

内部にオブジェクトが埋め込まれたエンティティ クラスがあります。

@Entity
public class Flight implements Serializable {

    /// .... other attributes
    @Embedded
    @AttributeOverrides({
        @AttributeOverride(name = "value", column =
        @Column(name = "FLIGHT_TIME")),
        @AttributeOverride(name = "dataState", column =
        @Column(name = "FLIGHT_TIME_TYPE", length = 20))
    })
    private DateDataStateValue flightDate;
}

DateDataStateValue は次のとおりです。

@Embeddable
public class DateDataStateValue implements DataStateValue<Date>, Serializable {

    private static final long serialVersionUID = 1L;

    @Column(name = "DATASTATE")
    @Enumerated(value = EnumType.STRING)
    private final DataState dataState;

    @Column(name = "DATAVALUE")
    @Temporal(TemporalType.TIMESTAMP)
    private final Date value;
}

CriteriaQuery を使用してデータベースからフライトのフェッチを実行し、時間列に Order オブジェクトを作成する場合:

Path<Flight> propertyPath = queryRoot.get("flightDate");
Order order = isAscending() ? criteriaBuilder.asc(propertyPath) :  criteriaBuilder.desc(propertyPath);

注文は私が望むものではありません。たとえば、フライト テーブルに次の値があるとします。

Flight 1  | ESTIMATED | 1 Jan 2012
Flight 2  | ESTIMATED | 1 Jan 2011
Flight 3  | ACTUAL    | 1 Jan 2010
Flight 4  | ESTIMATED | 1 Jan 2009

昇順ソートの結果は次のようになります。

Flight 3  | ACTUAL    | 1 Jan 2010
Flight 4  | ESTIMATED | 1 Jan 2009
Flight 2  | ESTIMATED | 1 Jan 2011
Flight 1  | ESTIMATED | 1 Jan 2012

@Embedded 列のデフォルトの順序付けは、クラスで名前が付けられた順序で要素の自然な順序付けを使用するようです。つまり、最初に DATASTATE、次に DATAVALUE です。

私がやりたいのは、並べ替えプロパティがflightDateの場合、順序は最初に日付、次に状態です。つまり:

Flight 4  | ESTIMATED | 1 Jan 2009
Flight 3  | ACTUAL    | 1 Jan 2010
Flight 2  | ESTIMATED | 1 Jan 2011
Flight 1  | ESTIMATED | 1 Jan 2012

DateDataStateValue を比較可能にしても影響はなく、@orderColumn/@OrderBy は適切ではないようです。誰にもアイデアはありますか?

前もって感謝します。

4

2 に答える 2

0

このような埋め込み可能なプロパティにクエリによる順序を追加できることさえ知りませんでした。しかし、私はそれに頼らず、クエリに 2 つの注文を追加するだけです。

Path<Flight> statePath = queryRoot.get("flightDate.dateState"); // or queryRoot.get("flightDate").get("dateState"): to be tested
Path<Flight> valuePath = queryRoot.get("flightDate.value");
Order[] orders;
if (isAscending()) {
    orders = new Order[] {criteriaBuilder.asc(valuePath), criteriaBuilder.asc(statePath)  };
}
else {
    orders = new Order[] {criteriaBuilder.desc(valuePath), criteriaBuilder.desc(statePath)  
}

query.orderBy(orders);
于 2012-05-03T13:11:33.317 に答える
0

"flightDate.value ASC, flightDate.dataState ASC"おそらく、定義したのは「flightDate」だけだったので、そのオブジェクトの自然な順序を意味します

于 2012-05-03T13:11:44.163 に答える