Java JPA标准按枚举集排序 我想使用JPA标准按枚举集排序

Java JPA标准按枚举集排序 我想使用JPA标准按枚举集排序,java,hibernate,jpa,enums,criteria,Java,Hibernate,Jpa,Enums,Criteria,这是我的枚举: public enum UserRole { SYS_ADMIN, CALIBRATOR_ADMIN, PROVIDER_ADMIN, } 实体: @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @Table(name = "USER") public class User { @Id private String username; priv

这是我的枚举:

    public enum UserRole {
    SYS_ADMIN,
    CALIBRATOR_ADMIN,
    PROVIDER_ADMIN,
    }
实体:

@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "USER")
public class User {

    @Id
    private String username;
    private String password;
    private String firstName;
    private String lastName;

@Embedded
    private Address address;

    @ManyToOne
    @JoinColumn(name = "organizationId")
    @JsonManagedReference
    private Organization organization;

    @ElementCollection
    @JoinTable(name = "USER_ROLE", joinColumns = @JoinColumn(name = "username"))
    @Enumerated(EnumType.STRING)
    @Column(name = "value", length = 30)
    private Set<UserRole> userRoles = new HashSet<>();
@实体
@NoArgsConstructor(access=AccessLevel.PROTECTED)
@表(name=“USER”)
公共类用户{
@身份证
私有字符串用户名;
私有字符串密码;
私有字符串名;
私有字符串lastName;
@嵌入
私人地址;
@许多酮
@JoinColumn(name=“organizationId”)
@JsonManagedReference
私人组织;
@元素集合
@JoinTable(name=“USER\u ROLE”,joinColumns=@JoinColumn(name=“username”))
@枚举(EnumType.STRING)
@列(name=“value”,长度=30)
private Set userRoles=new HashSet();
以及我如何尝试进行搜索查询:

public static CriteriaQuery<User> buildSearchQuery(String userName, String role, String firstName, String lastName, EntityManager em, String fieldToSort) {

        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<User> criteriaQuery = cb.createQuery(User.class);
        Root<User> root = criteriaQuery.from(User.class);

        Predicate predicate = ProviderEmployeeQuary.buildPredicate(root, cb, userName,role, firstName, lastName);

if (fieldToSort.length() > 0) {
            if (fieldToSort.substring(0, 1).equals("-")) {
                if (fieldToSort.substring(1, fieldToSort.length()).equals("userRoles")) {   
                    criteriaQuery.orderBy(cb.desc(root.<Set<UserRole>>get(fieldToSort.substring(1, fieldToSort.length()))));
                } else {
                    criteriaQuery.orderBy(cb.desc(root.get(fieldToSort.substring(1, fieldToSort.length()))));
                }
            } else {
                if (fieldToSort.equals("userRoles")) {

                    criteriaQuery.orderBy(cb.asc(root.<Set<UserRole>>get(fieldToSort)));

                } else {
                    criteriaQuery.orderBy(cb.asc(root.get(fieldToSort)));
                }
            }
        }
        criteriaQuery.select(root).distinct(true);
        criteriaQuery.where(predicate);
        return criteriaQuery;
    }
publicstaticcriteriaquerybuildsearchquery(字符串用户名、字符串角色、字符串名、字符串名、EntityManager em、字符串字段排序){
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery CriteriaQuery=cb.createQuery(User.class);
Root=criteriaQuery.from(User.class);
Predicate Predicate=ProviderEmployeeQuary.buildPredicate(根、cb、用户名、角色、名字、姓氏);
如果(fieldToSort.length()>0){
if(fieldToSort.substring(0,1).equals(“-”){
if(fieldToSort.substring(1,fieldToSort.length()).equals(“userRoles”){
orderBy(cb.desc(root.get(fieldToSort.substring(1,fieldToSort.length())));
}否则{
orderBy(cb.desc(root.get(fieldToSort.substring(1,fieldToSort.length())));
}
}否则{
if(fieldToSort.equals(“用户角色”)){
criteriaQuery.orderBy(cb.asc(root.get(fieldToSort));
}否则{
criteriaQuery.orderBy(cb.asc(root.get(fieldToSort));
}
}
}
criteriaQuery.select(root).distinct(true);
criteriaQuery.where(谓词);
返回标准查询;
}
执行此代码的错误是:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您有一个 SQL语法错误;请检查与您的SQL语法对应的手册 MySQL服务器版本,以便在“asc limit 5”附近使用正确的语法 第1行

生成的JPQL查询:

从用户中选择不同的GenerateDias0作为GenerateDias0内部 将generatedAlias0.organization作为generatedAlias1加入其中( 生成的lias1.id=11L)和(1=1)order by GenerateDias0.userRoles描述


您正在连接枚举字段上的表?令人惊讶。@Atais,这段代码是在我之前编写的。我的任务只是在该实体的早期版本中与枚举字段建立多对多关系,据我所知,这是为了优化,但我不确定枚举是否也是一个实体?反正是为了排序类似于
cb.asc的东西(root.get(fieldToSort)
应该可以。如果不起作用,发布CriteriaBuilderIt生成的sql不是实体。我添加了生成的queryYou正在连接enum字段上的表?令人惊讶。@Atais,这段代码是在我之前编写的。我的任务只是在该实体的早期版本中进行排序,这与enum字段有着多对多的关系,而且,据我所知,它是为了优化而做的,但我不确定枚举是否也是一个实体?无论如何,对于排序,像
cb.asc(root.get(fieldToSort)
应该这样做。如果它不起作用,发布CriteriaBuilderIt生成的sql不是实体。我添加了生成的查询