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]