具有 CSV 值的列上的 JPA 查询 IN 子句未返回确切结果

Posted

技术标签:

【中文标题】具有 CSV 值的列上的 JPA 查询 IN 子句未返回确切结果【英文标题】:JPA query IN clause on column with CSV values not returning exact results 【发布时间】:2020-06-19 16:49:47 【问题描述】:

我正在处理需要获得正确结果的 JPA 查询。

表结构(我们称之为T1):

这是我的 JPA 查询:

@Query("from T1 t where t.csv in :ids")
List<T1> listT1Records(@Param("ids") List<String> ids);

csv 列也可以包含非数字字符串。当我使用原始 sql 查询时,它返回记录 123 这是我想要的结果,但是当我调试我的代码时,返回的结果是只记录2。我到处寻找答案,但一无所获。

原始 Sql

select * from T1 where csv in (11);

【问题讨论】:

在您的测试期间 ids 列表包含什么?你也可以发布你的“原始sql”查询吗? @MarcoLucidi id 包含“11”。 什么数据类型存储csv列?似乎是来自 java 和表图片的字符串(varchar),但来自原始 sql 的数字。无论如何,如果它存储一个字符串,则 jpa 方法的输出是正确的,id 为 2 的记录是唯一在 csv 列中具有字符串“11”的记录。 【参考方案1】:

IN 导致无法这样工作。

    您应该将列表转换为逗号操作的字符串:
String.join(",", ids);
    使用以下查询:
@Query("from T1 t where t.csv like %:ids%")
List<T1> listT1Records(@Param("ids") String ids);

【讨论】:

以上是关于具有 CSV 值的列上的 JPA 查询 IN 子句未返回确切结果的主要内容,如果未能解决你的问题,请参考以下文章

仅使用具有“in”子句中所有值的列加入查询

如何在 @OneToMany 关系映射的列上使用 JPA findBy 查询?

SQL Server:查询应用在 where 子句中,包含 Json 对象的列上的 IS NOT Null 需要更多时间

PHP 和 MYSQL:查询在具有值的列上返回 null

如何为 where 子句中的列编写具有不连续值的 Cassandra 查询

使用JPA在Sql中具有不同值的多个语句where子句