Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.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
Java 在JPA查询中包含枚举_Java_Spring_Hibernate_Jpa_Enums - Fatal编程技术网

Java 在JPA查询中包含枚举

Java 在JPA查询中包含枚举,java,spring,hibernate,jpa,enums,Java,Spring,Hibernate,Jpa,Enums,我有一节课,形式如下 @Entity public class Person{ public enum SEX { MALE, FEMALE, OTHER } private String name; private SEX sex; } 我有一个接口类,它扩展了JpaRepostory。枚举在查询中不起作用。我正在尝试使用springjpa获取数据 public interface PersonRepository extends JpaRep

我有一节课,形式如下

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

    private String name;
    private SEX sex;
 }
我有一个接口类,它扩展了
JpaRepostory
。枚举在查询中不起作用。我正在尝试使用
springjpa
获取数据

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,);

}
公共接口PersonRepository扩展了JpaRepository{
@查询(“从人员p中选择p,其中
“p.SEX=com.example.Person.SEX.MALE”+
“和p.name=:name”)
公共列表检查名(@Param(“name”)字符串名,);
}
我得到以下例外

原因:org.hibernate.hql.internal.ast.QuerySyntaxException:无效路径:“com.example.Person.Sex.MALE”


如何修复它?

您没有考虑类和属性的大小写。应该这样做

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

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

备选案文1: 将枚举定义为包
com中的顶级类。示例

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);

}
然后需要将存储库编写为

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);

}

虽然生成的字节码存储在类
Person$SEX.class

中,或者使用参数并将其设置为枚举值,但会引发。枚举名为SEX,而不是SEX。Person中的SEX属性名为SEX,而不是SEX。请遵循Java命名约定。这实际上有助于防止错误。如何在实体中映射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);

}
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]