精华:
@Entity
@Table(name = "shapes")
public class Shape {
@Id
Integer id;
@Column(name = "type")
@Enumerated(EnumType.STRING)
ShapeType type;
}
枚举:
public enum ShapeType {
RECTANGLE("Прямоугольник"),
SQUARE("Квадрат"),
CIRCLE("Круг");
private final String name;
ShapeType(name) {
this.name = name;
}
}
在获取形状列表时,我想按name字段属性进行排序。type在我的理解中,它会是这样的:
@Query("SELECT s FROM Shape s ORDER BY s.type.name ASC")
List<Shape> getAll();
但是这样的请求会产生错误:
org.hibernate.QueryException: could not resolve property: name of: com.zhenyria.project.model.Shape
有没有办法按字段本身排序enum?也许覆盖一个方法compareTo()或类似的东西会有所帮助?
重要提示:排序必须在数据库级别进行。我正在使用分页,所以代码中的排序选项不起作用!
为了使排序工作,我实现了
enum保存到数据库的转换。从
JPA 2.1有一个注释开始@Converter。转换器在保存时转换属性并在获取时恢复为原始类型。我的转换器代码:
现在您可以删除实体
@Enumerated中字段上方的注释。如果我没有在注释中指出,那么我将不得不用注释标记该字段。所以 Spring 在保存到数据库时会自动转换这种类型。ShapeTypeShapeautoApply=true@Converter现在您可以指定按字段排序,
type它将正常工作:对象的排序输出
Shape不会是这样的(经典的按枚举名字段排序,使用时保存到数据库中@Enumarated(EnumType.STRING)):还有这个(这里我们不保存枚举的名称,而是保存到数据库时将其转换为的值):