当前位置: 首页 > 知识库问答 >
问题:

使用枚举列表作为参数的IN关键字的Spring数据查询方法

杜高谊
2023-03-14

我正在使用一个Spring数据JPA(4.3.5)存储库和一个查询方法,该方法在关键字子句中使用<代码>列表

给定如下实体:

@Entity
@Table(name = "R_REPRESENTACIO")
public class Representacio {

    @Enumerated(EnumType.STRING)
    private Estat estat;   

    ...
    //getters and setters
    ...
}

使用该SQL声明:

CREATE TABLE R_REPRESENTACIO (
  UUID NUMBER(19) NOT NULL,
  ...
  ESTAT VARCHAR2(255) NULL,
  ...
);

Estat是一个枚举类,类似于:

public enum Estat {
        VALIDA,
        PENDENT_VALIDACIO,
        PENDENT_DOCUMENTACIO,
        ...
}

和JPA存储库,如:

public interface RepresentacioRepository extends JpaRepository<Representacio, Long> {
    List<Representacio> findAllByEstatIn(List<Estat> estats);
}

当我运行(联调类):

List<Estat> estats = 
  Arrays.asList(Estat.VALIDA,Estat.PENDENT_DOCUMENTACIO,Estat.PENDENT_VALIDACIO);
List<cat.aoc.representa.domain.entity.representacio.Representacio> allByEstatIn = representacioRepository.findAllByEstatIn(estats);

生成的SQL是(在内存H2 DB中):

2018-08-01 12:30:48.534--ServerSession(1175154004)--Connection(384887832)--Thread(Thread[main,5,main])--SELECT UUID, .... FROM R_REPRESENTACIO WHERE (ESTAT IN ((?,?,?)))
    bind => [VALIDA, PENDENT_DOCUMENTACIO, PENDENT_VALIDACIO]

不会引发任何SQL异常,并且不会返回任何结果。但这应该返回1个结果,因为此(等效)SQL返回:

SELECT count(*) FROM R_REPRESENTACIO WHERE ESTAT IN ('VALIDA','PENDENT_DOCUMENTACIO','PENDENT_VALIDACIO');

COUNT(*)
----------
         1

我能看到的独特区别是我如何在"(该列是VARCHAR)之间包装IN子句参数。

我不知道为什么从JPA存储库生成的SQL没有返回结果。(我也尝试过findAllByEstatIsIn(列表

有什么建议/解释吗?

PS:工作(不满意)使用

List<Representacio> findAllByEstatOrEstatOrEstat(Estat estat, Estat estat2, Estat estat3);

但这在很多方面都是丑陋和错误的。。。


共有2个答案

孙辰阳
2023-03-14

我建议使用类型为List的参数

  1. <代码>列表
@Configuration
public class ConverterConfiguration extends RepositoryRestConfigurerAdapter {
  @Autowired
  private EstatsConverter estatsConverter;

  @Override
  public void configureConversionService(ConfigurableConversionService conversionService) {
    conversionService.addConverter(estatsConverter);

    super.configureConversionService(conversionService);
  }
@Component
public class EstatsConverter implements Converter<String, Estat> {

    @Override
    public Estat convert(String source) {
        return Estat.fromString(source);
    }
}

我不知道这是否可行,但我记得我也做过类似的事情,只是在MongoDB。如果你试着那样做,请告诉我。

单于亮
2023-03-14

使用Spring数据JPA和JPQL非常简单:

@Repository
public interface RepresentacioRepository extends JpaRepository<Representacio, Long> {

    @Query("select r from Representacio r where r.estat in :estat2")
    List<Representacio> findByEnumEstat(@Param("estat2") List<Estat> estatList);
}

 类似资料:
  • 我的可见性没有被索引吗?还是我不该这么做?我没有尝试用字符串更改可见性属性,我认为这应该有效,因为我有其他可以成功查询的字符串属性。使用'in'操作符是一个额外的好处! 编辑1:我使用的是spring-data-neo4j2.0.1.release。我试图在单元测试中使用,但是我刚刚意识到在使用默认配置运行服务器时可以工作,但是在单元测试中仍然不能工作。而且,即使在运行服务器时,'IN'子句仍然会

  • 我想使用中定义的枚举作为查询字符串中参数定义的一部分。 我在我的Swagger 2.0规范文件的< code>definitions部分定义了Swagger枚举。 我可以在其他定义中创建对它的引用: 当参数在:body中为中为

  • 如何使用枚举的作为MyBatis查询的参数?我已经为它创建了一个类型处理程序,并指定了另一个问题中描述的映射类型。当它应该是数千时,它返回0计数。 调试日志显示正确的值('A'、'T'、'ST'),但它会为计数打印0。 MyBatis XML的参考文档:http://www.mybatis.org/mybatis-3/configuration.html#typeHandlers

  • 我有一个Spring Boot应用程序,使用Spring Data JPA查询MySQL数据库。 我需要得到一份经过一些参数筛选的课程列表。 我通常使用语法

  • 我是Spring启动的新手,并试图使用枚举作为Rest请求的参数。 这是我的枚举类: 在我的控制器类中,我使用了以下方法: 这是我的JSON: 但它不起作用。。我收到以下错误: