首页 > 解决方案 > 如何将嵌套列表的列表传递到 JPA 本机查询中

问题描述

我需要创建一个与以下示例相关的 JPA 本机查询:

select * from inventory where (server, product) in (('server1','product1'), ('server2','product2'), ('server1','product3'));

我创建了一个本机查询:

@Query(
            value = "select server, product from inventory where (server, product) in (:myList)",
            nativeQuery = true
    )
    List<Product> getProducts(List<List<String>> myList);

但是当我将列表列表作为参数传递时:

List<List<String>> myList= Arrays.asList(
    Arrays.asList("server1","product1"),
    Arrays.asList("server2","product2"),
    Arrays.asList("server1","product3")
);
List<Product> products = myRepository.getProducts(myList);

我收到一个错误

java.sql.SQLSyntaxErrorException: ORA-00920: invalid relational operator

我使用 Oracle 数据库。请告诉我,我做错了什么?

这个问题不是关于将平面列表传递到本机查询以按 1 列过滤数据库结果(这很好用),而是如何将嵌套列表列表传递到查询中以按 2 列过滤数据库结果

标签: javaoraclespring-bootjpa

解决方案


已知缺少括号或逗号会引发此错误。

java.sql.SQLSyntaxErrorException: ORA-00920: invalid relational operator

所以我认为它会将您的通用列表解析为 String

请注意将您的数据解析为 String ,我建议您使用 String 作为 getProducts 方法的参数,否则您应该先解析该函数​​中的列表,然后再将其添加到查询中:

这是一个如何解析通用列表的示例:

 String myListToStr = "";
    for(List<String> list : myList){
        myListToStr += "(\"" + String.join("\",\"", list) + "\")";
    }
    myListToStr = myListToStr.replace(")(", "),(");
    System.out.println(myListToStr);

结果:( "server1","product1"),("server2","product2"),("server1","product3")

正是您在这种情况下所需要的。

希望您会很好地使用此解决方案。如果它确实解决了您的问题,请务必将其标记为答案!


推荐阅读