如何在 SQL (JPA) 中使用带有 IN 运算符的嵌套 SELECT 语句?

Posted

技术标签:

【中文标题】如何在 SQL (JPA) 中使用带有 IN 运算符的嵌套 SELECT 语句?【英文标题】:How to use nested SELECT statements with IN operator in SQL (JPA)? 【发布时间】:2020-01-06 19:56:14 【问题描述】:

我想在我的 java 类中使用以下 SQL 查询:

SELECT * 
FROM table1
WHERE attribute1 IN (
  SELECT attribute1
  FROM table2
  WHERE attribute2 = c
)

这里table1table2 是两个具有公共列 attribute1 的实体。

如何将查询的结果作为table1 类型的列表获取?

【问题讨论】:

试试table2.attribute1 如果您在 SQL-developer 中使用此 SQL,您的实际结果是什么,您期望它是什么?请edit您的帖子提供一些示例输出。所以我们现在是您当前的起点和期望的目标。 【参考方案1】:

您无法将结果作为 table1 类型的列表。 表是列的集合。 Java List 只能包含一列的集合。 想象一下table1 包含 5 列不同的数据类型(比如 INTEGER、VARCHAR2、INTEGER、VARCHAR2、VARCHAR2)。您的查询将返回包含所有这些值的 ResultSet。 现在,您期望一个简单的 List 来存储所有这些值。这是不正确的。 如果要存储特定列的所有值,则可以如下所示进行。

Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM table1 WHERE attribute1 IN (SELECT attribute1 FROM table2 WHERE attribute2 = c)");
List<String> attr = new ArrayList<String>();

while (rs.next()) 
    attr.add(rs.getString("attribute1"));

如果您想获取不同列的值,请使用rs.getXXX("&lt;column_name"); 获取其详细信息。注意:根据列的数据类型将 getXXX 替换为适当的方法。例如,getString() 用于 VARCHAR,getInt() 用于 INTEGER 等。

【讨论】:

如果它解决了您的问题,请接受答案。

以上是关于如何在 SQL (JPA) 中使用带有 IN 运算符的嵌套 SELECT 语句?的主要内容,如果未能解决你的问题,请参考以下文章

JPA 如何获取 Criteria API 中使用的参数标记的数量?

带有 sql IN 运算符的参数列表的preparedstatement

带有 IN 语句的 JPA 本机查询

JPA 查询语言中的 IN 和 = 运算符

如何将表中列中的逗号分隔值放入 SQL IN 运算符?

如何在 JPA/Hibernate 中执行本机 SQL 脚本?