Java jdbc-一个查询中有多个select语句

Java jdbc-一个查询中有多个select语句,java,mysql,jdbc,Java,Mysql,Jdbc,首先,我想说的是,这个问题与加入或联合无关。 另外,我已经尝试了一些关于堆栈溢出的答案,但仍然存在一些问题。例如: 问题: 我想从两个表中检索数据,但我不能使用JOIN或UNION,因为它们包含不同类型的数据,并且我要从每个表中检索不同数量的行。我想一次完成的原因是效率。但是,如果有人能够说服我,两个调用而不是一个调用在开销上几乎没有区别,那么我会很高兴地像那样解决我的问题,尽管知道如何只使用一个查询还是很好的 代码: 基于此,我编写了以下代码摘录: String sql = "SET @org

首先,我想说的是,这个问题与加入或联合无关。 另外,我已经尝试了一些关于堆栈溢出的答案,但仍然存在一些问题。例如:

问题: 我想从两个表中检索数据,但我不能使用JOIN或UNION,因为它们包含不同类型的数据,并且我要从每个表中检索不同数量的行。我想一次完成的原因是效率。但是,如果有人能够说服我,两个调用而不是一个调用在开销上几乎没有区别,那么我会很高兴地像那样解决我的问题,尽管知道如何只使用一个查询还是很好的

代码: 基于此,我编写了以下代码摘录:

String sql = "SET @organizationId = 0;" +
                "SELECT @organizationId := Id 'Id', Name FROM Organization WHERE Id = ?;" +
                "SELECT AssociatedOrganizationId FROM OrganizationAssociations WHERE OrganizationId = @organizationId;";

        Connection conn = null;

        try {
            conn = dataSource.getConnection();

            CallableStatement cs = conn.prepareCall(sql);
            cs.setInt(1, organizationId);

            boolean isResultSet = cs.execute();

            if (!isResultSet) {
                logger.error("getOrganization - retrieved result is not a ResultSet");
            }

            OrganizationDto organization = null;

            ResultSet rs = cs.getResultSet();
            if (rs.next()) {
                // create organization object using retrieved data
            }

            rs.close();
引发问题的行为:

cs.execute始终返回false

我为解决问题而采取的观察和行动: 正如Java文档中所述,CallableStatement设计用于调用存储过程。存储过程本身从不返回值,这只能通过OUT参数实现。 记住这一点,我并不感到惊讶。execute返回false。 然而,我已经将CallableStatement更改为PreparedStatement和Statement,但就结果而言,这并没有多大变化。getResultSet仍然返回null

我正在寻找的答案是: 1.我想知道如何在jdbc中使用一个查询和多个SELECT语句从多个表检索数据。这在没有连接、联合等的情况下是可以实现的。如果可能的话,我希望能够使用我已有的查询,查询在HeidiSQL中进行了完美的测试。 2.可选如果有人认为两个查询在数据库负载和性能方面不会有太大差别,那么我希望确信事实确实如此

更新1: 澄清一下,这是我的查询返回的数据: 结果集1: 身份证,姓名 1,组织名称 结果集2: 关联组织ID 2.
3

首先,可以使用联接将两个查询编写为单个查询:

SELECT AssociatedOrganizationId
FROM OrganizationAssociations oi JOIN
     Organization o
     ON oa.OrganizationId = o.id
WHERE o.id = ?
其次,这甚至不需要,因为您可以将整个过程简化为:

SELECT AssociatedOrganizationId
FROM OrganizationAssociations oi
WHERE oa.OrganizationId = ?

我建议您花些时间研究SQL并了解数据库是如何工作的。它可能会极大地帮助您解决您想要解决的问题。

使用一个proc,返回两个游标并使用它们,您在Callable语句中遇到了什么问题?是否可以按原样使用查询,而不是创建存储过程?我来自.NET背景,类似这样的查询并不少见。如前所述,CallableStatement.execute在我的情况下总是返回false,这可能是因为我调用的存储过程中没有使用paramThank@GordThompson。如果其他任何人能够确认这确实是MySQL中实现此功能的唯一方法,那么我将创建存储过程,这就是我解决此问题的方法。我需要一些关于organization表和关联组织列表ids OrganizationAssociations表的详细信息。因此,我的查询结果是:{Id,Name}和{AssociatedOrganizationId}。第一个结果集包含一行,另一个可以包含多行。Gordon的假设似乎是正确的。通过发布样本数据和所需信息来证明我们是错误的output@e4c5-更新了我的问题,证明Gordon做对了Gordon的查询只返回1个结果集-关联组织列表。它不会返回组织的详细信息。