Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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 Spring Data JPA使用@query或按函数名筛选枚举值集_Java_Sql_Jpa_Enums_Spring Data Jpa - Fatal编程技术网

Java Spring Data JPA使用@query或按函数名筛选枚举值集

Java Spring Data JPA使用@query或按函数名筛选枚举值集,java,sql,jpa,enums,spring-data-jpa,Java,Sql,Jpa,Enums,Spring Data Jpa,我在MyClass(一个实体)中有一组枚举作为属性,并希望使用@Query或JPA函数名查询(不知道它的正确名称…)来过滤枚举的字符串值 我的枚举: public enum MyEnum { ONE("First string value"), TWO("Second string value"), THREE("Third string value"); private MyEnum (String name) { this.name = nam

我在MyClass(一个实体)中有一组枚举作为属性,并希望使用@Query或JPA函数名查询(不知道它的正确名称…)来过滤枚举的字符串值

我的枚举:

public enum MyEnum {
    ONE("First string value"),
    TWO("Second string value"),
    THREE("Third string value");

    private MyEnum (String name) {
       this.name = name;
    }
    private final String name;

    @Override
    public String toString() {
        return name;
    }
}
MyClass实体中枚举集的声明

@Size(min=1)
@ElementCollection (fetch = FetchType.EAGER)
@Enumerated(EnumType.STRING)
private Set<MyEnum> myenums;
@我的存储库中的查询尝试

@Query(value = "SELECT * from mytable t " +
            " left join myclass_myenums e ON e.myclass_id= t.id " +
            " WHERE " +
            " e.myenum LIKE CONCAT('%',:filtertext,'%') " 
            , nativeQuery = true)
    List<RisikoEntity> findbyFilter(@Param("filtertext") String filtertext);
@Query(value=“从mytable t中选择*+
“在e.myclass\u id=t.id上左加入myclass\u myenums e”+
“哪里”+
“e.myenum-LIKE CONCAT('%,:filtertext,'%)”
,nativeQuery=true)
列出findbyFilter(@Param(“filtertext”)字符串filtertext);
这是可行的,但问题是,它过滤字符串“1”、“2”、“3”,而不是“第一个字符串值”、“第二个…”等等


在我的存储库中使用函数名thing attempt的替代尝试:

List<MyClass> findByMyenumsContainsIgnoreCase(String filterstring)

---> Error: "Parameter value [%First%] did not match expected type [path.to.MyEnum (n/a)]"
List findbymyenumcontainsignorecase(字符串过滤器字符串)
--->错误:“参数值[%First%]与预期类型[path.to.MyEnum(n/a)]不匹配”
第二次尝试:

List<MyClass> findByMyenums_NameContainsIgnoreCase(String filterstring)

--> Error: "Illegal attempt to dereference path source [null] of basic type"
List findByMyenums\u name containsignorecase(字符串过滤器字符串)
-->错误:“非法尝试取消对基本类型的路径源[null]的引用”
我做错了什么

  • 如何在第一个解决方案中过滤实际的枚举字符串值
  • 如何使用JPA函数名筛选枚举集

  • 我想说这是不可能的,因为JPA不会持久化枚举的
    name
    字符串,而是持久化枚举的实际名称

    因此,数据库应该在
    myenum
    列中包含一个或两个字符串值,而不是第一个字符串值或第二个字符串值


    解决此问题的唯一方法是首先按代码过滤枚举,然后按该枚举查找。如果使用JPA 2.1,您可以尝试使用其
    @Converter
    注释,但这会产生很大的开销,因为转换后的字符串值必须存储在实体中:

    @转换器(autoApply=true)
    公共类MyEnumConverter实现AttributeConverter{
    @凌驾
    公共字符串convertToDatabaseColumn(MyEnum MyEnum){
    if(myEnum==null){
    返回null;
    }
    返回myEnum.toString();
    }
    @凌驾
    公共MyEnum convertToEntityAttribute(字符串代码){
    如果(代码==null){
    返回null;
    }
    返回Stream.of(MyEnum.values())
    .filter(m->m.toString().equals(代码))
    .findFirst()
    .orelsetrow(IllegalArgumentException::new);
    }
    }
    
    您的枚举代码似乎无法编译。您必须有其他字段来设置描述,如果您的枚举的表描述中没有
    JOIN\u id
    ,其中有
    myclass\u id
    ,那么如何在查询中进行JOIN工作?对不起,我忘记了示例中的构造函数,这是您的意思吗?你是对的,我不想给出我所有的实际代码,所以我不得不为MCVE重命名一些东西,我编辑了它。我认为这是不可能的,这里enum不是一个字符串,比如expect string表达式是的,构造函数。如果我理解正确,我将不得不用“第一个字符串值”在第二列中,并在该列上为@Query解决方案进行筛选?您可以这样做是的,创建一个包含枚举的表。我尝试过这样做,但它仍然筛选为“一”而不是“第一个字符串值”-我还尝试添加@Convert(converter=MyEnumConverter.class)以防自动应用不起作用,但结果相同:/解决了-我需要将@Enumerated(EnumType.STRING)替换为@Convert(顺便说一句,自动应用由于某种原因不起作用)。谢谢!
    List<MyClass> findByMyenums_NameContainsIgnoreCase(String filterstring)
    
    --> Error: "Illegal attempt to dereference path source [null] of basic type"