Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
Jpa 按枚举排序的JPQL_Jpa_Enums_Glassfish_Jpql - Fatal编程技术网

Jpa 按枚举排序的JPQL

Jpa 按枚举排序的JPQL,jpa,enums,glassfish,jpql,Jpa,Enums,Glassfish,Jpql,我想从按优先级列排序的表(即enum)中获取数据。我们使用JavaEE6,GF3.1 我们的实体看起来像这样 @Entity @Table(name="ITEMS") @NamedQueries({ @NamedQuery( name = "Item.findbyPriority", query = "select i from Item i where ORDER BY i.priority DESC" ) }) public class Item im

我想从按优先级列排序的表(即enum)中获取数据。我们使用JavaEE6,GF3.1

我们的实体看起来像这样

@Entity
@Table(name="ITEMS")
@NamedQueries({
    @NamedQuery(
        name = "Item.findbyPriority",
        query = "select i from Item i where ORDER BY i.priority DESC" )
})
public class Item implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    Integer id;



    String data inputFile;


    @Enumerated(EnumType.ORDINAL)
    Priority priority;


...
}
定义了优先级

public enum Priority {

    HIGH,
    NORMAL;
}
但是Item.findbyPriority查询按顺序排序,并以错误的顺序返回结果。如果我把优先等级改为

public enum Priority {

        NORMAL,
        HIGH;
    }
它工作正常。但这并不是真正的稳健。如果我添加新的优先级使用或重新排序该怎么办

我试图重写compareTo方法,但它在Enum类中是最终的

在这种情况下我能做什么?怎样才能用好的方式来做呢

我知道我可以将优先级存储为数字等,但我必须手动将实体同步到Enum,这不是很好。 也许@PrePersist、@PreUpldate和@PostLoad方法是最好的选择?那么jpql查询会是什么样子呢

谢谢


米兰

影响命名查询之外优先级顺序的唯一方法是选择枚举属性的类型(序号、字符串)

即使覆盖compareTo会被大声调用,它也不会改变什么,因为在执行查询时不会调用它。原因是JPQL查询被转换为SQL查询,并且没有从SQL查询调用Java方法的概念

另外,指定回调方法也没有帮助,因为它们与生成查询或影响结果列表的顺序无关


您可以使用后处理方法来定义列表的顺序,并在执行命名查询得到结果后调用该方法。

影响命名查询之外优先级顺序的唯一方法是选择枚举属性的类型(序号、字符串)

即使覆盖compareTo会被大声调用,它也不会改变什么,因为在执行查询时不会调用它。原因是JPQL查询被转换为SQL查询,并且没有从SQL查询调用Java方法的概念

另外,指定回调方法也没有帮助,因为它们与生成查询或影响结果列表的顺序无关


您可以使用后处理方法来定义列表的顺序,并在获得执行命名查询的结果后调用该方法。

谢谢您的回答,您所说的基本上是对返回结果重新排序,对吗?谢谢您的回答,您所说的基本上是对返回结果重新排序,对吗?