我将使用Spring Data JPA (4.3.5)存储库,并使用IN关键字子句的查询方法,其中一个
给定这样的实体:
当我运行(集成测试类)时:
生成的SQL(在内存中的H2数据库中)如下所示:
没有抛出任何No SQL异常并且没有返回任何结果。 但是这个应该返回一个结果,因为等效的SQL语句会返回一个结果:
但是这种做法在很多方面都不美观且错误...
List<Enum>
字段作为参数。问题是它没有按照我期望的方式工作。给定这样的实体:
@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数据库中)如下所示:
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]
没有抛出任何No SQL异常并且没有返回任何结果。 但是这个应该返回一个结果,因为等效的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);
但是这种做法在很多方面都不美观且错误...
@Enumerated(EnumType.STRING)
,所以列是varchars,但是您的参数是枚举列表。您尝试过使用字符串列表吗? - mrkernelpanic@Query("select r FROM Representacio r where r.estat in :estats")
- mrkernelpanicList<Representacio> findByEstatIn(List<Estat> estats)
会怎样? - StanislavL