【问题标题】:Including enum in JPA query在 JPA 查询中包含枚举
【发布时间】:2017-03-18 15:55:44
【问题描述】:

我有以下形式的课程。

@Entity
public class Person{
    public enum SEX {
      MALE, FEMALE, OTHER
    }

    private String name;
    private SEX sex;
 }

我有一个扩展JpaRepostory 的接口类。枚举在查询中不起作用。我正在尝试使用Spring JPA 获取数据。

public interface PersonRepository extends JpaRepository<Person, Long> {


    @Query("SELECT p FROM Person p WHERE 
            "p.SEX = com.example.Person.Sex.MALE " +
            "AND p.name = :name")
    public List<Person> checkName(@Param("name") String name,);

}

我得到以下异常

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Invalid path: 'com.example.Person.Sex.MALE'

我该如何解决?

【问题讨论】:

  • 或使用参数并将其设置为枚举值
  • 你的枚举被命名为 SEX,而不是 Sex。您在 Person 中的性别属性名为 sex,而不是 SEX。
  • 请遵循 Java 命名约定。它实际上有助于防止错误。
  • 你是如何在实体类中映射 sex 列以及 sex 的数据库列类型是什么。

标签: java spring hibernate jpa enums


【解决方案1】:

你不尊重你的类和属性的情况。应该是

p.sex = com.example.Person.SEX.MALE

【讨论】:

    【解决方案2】:

    除了已经提到的 case 错误之外,还有另一个问题:你的 enum 类是一个嵌套类。第三个问题是 Hibernate 似乎有大写类名的问题,即您需要将类名从 SEX 更改为 Sex

    变体 1:

    将枚举定义为包com.example中的顶级类

    package com.example;
    public enum Sex {
        MALE, FEMALE, OTHER
    }
    

    然后您可以使用例如从存储库访问枚举值com.example.Sex.MALE:

    @Repository
    public interface PersonRepository extends JpaRepository<Person, Long> {
    
        @Query("SELECT p FROM Person p WHERE " + 
                "p.sex = com.example.Sex.MALE " +
                "AND p.name = :name")
        public List<Person> checkName(@Param("name") String name);
    
    }
    

    令人惊讶的是(一个错误?)如果您将枚举的名称从 Sex 更改为 SEX(显然在查询中调整名称),这将导致错误。

    变体 2:

    您可以将Sex 的定义保留为嵌套类。然后将枚举编译到名称为Person$Sex.class 的类中。只需在查询字符串中使用此名称:

    @Entity
    public class Person {
    
        public enum Sex {
            MALE, FEMALE, OTHER
        }
    
        @Id @GeneratedValue long id;
        private String name;
        private Sex sex;
        
        public Person() {}
        public Person(String name, Sex sex) {
            this.name = name;
            this.sex = sex;
        }
    }
    

    然后需要将存储库编写为

    public interface PersonRepository extends JpaRepository<Person, Long> {
    
        @Query("SELECT p FROM Person p WHERE " + 
                "p.sex = com.example.Person$Sex.MALE " +
                "AND p.name = :name")
        public List<Person> checkName(@Param("name") String name);
    
    }
    

    再一次,如果您将嵌套类的名称从 Sex 更改为 SEX(也在查询字符串中),那么文本会出现异常

    Invalid path: 'com.example.Person$SEX.MALE' 
       [SELECT p FROM com.example.Person p WHERE p.sex = com.example.Person$SEX.MALE 
                                                                 AND p.name = :name]
    

    被抛出,尽管生成的字节码存储在类Person$SEX.class中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      • 2020-04-15
      • 1970-01-01
      相关资源
      最近更新 更多