内部にオブジェクトが埋め込まれたエンティティ クラスがあります。
@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 は適切ではないようです。誰にもアイデアはありますか?
前もって感謝します。