Jpa 按枚举排序的JPQL
我想从按优先级列排序的表(即enum)中获取数据。我们使用JavaEE6,GF3.1 我们的实体看起来像这样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
@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方法的概念 另外,指定回调方法也没有帮助,因为它们与生成查询或影响结果列表的顺序无关
您可以使用后处理方法来定义列表的顺序,并在获得执行命名查询的结果后调用该方法。谢谢您的回答,您所说的基本上是对返回结果重新排序,对吗?谢谢您的回答,您所说的基本上是对返回结果重新排序,对吗?