gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:12:55 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com