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

标签 java spring spring-data

我正在使用 Spring Data JPA (4.3.5) 存储库和使用带有 List<Enum> 的 IN 关键字子句的查询方法字段作为参数。问题是它没有像我预期的那样工作

给定一个实体,如:

@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

我能看到的唯一区别是我如何将 IN 子句参数包装在“”(该列是 VARCHAR)之间。

我不知道为什么从 JPA 存储库生成的 SQL 没有返回结果。 (我也试过 findAllByEstatIsIn(List<Estat> estats) 返回相同的零结果)。

有什么建议/解释吗?

PS:变通(不满意)使用

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

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

最佳答案

我建议使用 List<String> 类型的参数并添加转换器 String -> Enum所以Spring将能够转换它。所以,基本上:

  1. List<Representacio> findByEstatIn(List<String> estats);
  2. 2.
@Configuration
public class ConverterConfiguration extends RepositoryRestConfigurerAdapter {
  @Autowired
  private EstatsConverter estatsConverter;

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

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

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

我不知道这是否行得通,但我记得只在 MongoDB 中做过类似的事情。如果您尝试这样做,请告诉我。

关于java - 使用枚举列表作为参数的 IN 关键字的 Spring Data 查询方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51631879/

相关文章:

java - Spring4 Boot WebService Controller 无法与 Gradle Tomcat 插件一起使用

java - 如何使用 java config 而不是 XML 声明存储库填充器 bean?

java - 我想向此计算器添加图形

java - 如何连接到 JBOSS 服务器上运行的远程 Web 应用程序?

java - QueryDSL where 子句上的 NullPointerException

java - 我可以在请求正文而不是 header 中发送 OAuth 2.0 凭据吗?

java - 诊断 Spring Data 中的事务异常

java - 使用 Selenium JAVA 代码读取具有 <SPAN> 标签的列

java - 从文本文件在 Java 中制作列表

java - 如何在不使用spring security的情况下限制登录用户在spring中访问登录页面?