作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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将能够转换它。所以,基本上:
List<Representacio> findByEstatIn(List<String> estats);
@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 中做过类似的事情。如果您尝试这样做,请告诉我。
关于java - 使用枚举列表作为参数的 IN 关键字的 Spring Data 查询方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51631879/
我是一名优秀的程序员,十分优秀!