Java 重写JPA@Embedded列上的排序行为
我有一个实体类,其中包含一个嵌入对象:Java 重写JPA@Embedded列上的排序行为,java,jpa,Java,Jpa,我有一个实体类,其中包含一个嵌入对象: @Entity public class Flight implements Serializable { /// .... other attributes @Embedded @AttributeOverrides({ @AttributeOverride(name = "value", column = @Column(name = "FLIGHT_TIME")), @Attr
@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;
}
升序排序的结果将是:
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列的默认顺序似乎是按照元素在类中的命名顺序使用元素的自然顺序。首先是Ie数据状态,然后是数据值
我想做的是,每当sort属性为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似乎不适合该作业。有人有什么想法吗
提前感谢。我甚至不知道您可以通过查询在这样的可嵌入属性上添加订单。但我不会依赖它,只需在您的查询中添加两个订单:
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);
Path statePath=queryRoot.get(“flightDate.dateState”);//或queryRoot.get(“flightDate”).get(“dateState”):待测试
路径值Path=queryRoot.get(“flightDate.value”);
订单[]份订单;
if(isascing()){
订单=新订单[]{criteriaBuilder.asc(valuePath),criteriaBuilder.asc(statePath)};
}
否则{
订单=新订单[]{criteriaBuilder.desc(valuePath),criteriaBuilder.desc(statePath)
}
query.orderBy(订单);
类似于的“flightDate.value ASC,flightDate.dataState ASC”
也许,因为您定义的都是“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
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);