Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重写JPA@Embedded列上的排序行为_Java_Jpa - Fatal编程技术网

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);