java - 如何将嵌套列表的列表传递到 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 列过滤数据库结果。
解决方案
已知缺少括号或逗号会引发此错误。
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")
正是您在这种情况下所需要的。
希望您会很好地使用此解决方案。如果它确实解决了您的问题,请务必将其标记为答案!
推荐阅读
- java - VPL 中的编译错误,但 Intellij 中没有(Java,大学作业)
- scipy - Scipy - Skimage - slic 不适用于灰度图像
- python - 如何在热图中添加自定义刻度?
- sql - Postgresql 查询将列转置为行
- git - 如何对 GitLab 的网络文件夹进行源代码控制?
- gnuplot - gnuplot:圆圈之间的箭头
- python - 箭头键通过 Gtk.FlowBox.select_child() 忽略选择
- javascript - 函数的预期值
- c++ - 在构造期间初始化 const 成员
- python-3.x - 按一定顺序连接 2 个列表