Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringBoot,JPA/Hibernate:如何同时执行两个原始SELECT查询?_Java_Hibernate_Spring Boot_Jpa - Fatal编程技术网

Java SpringBoot,JPA/Hibernate:如何同时执行两个原始SELECT查询?

Java SpringBoot,JPA/Hibernate:如何同时执行两个原始SELECT查询?,java,hibernate,spring-boot,jpa,Java,Hibernate,Spring Boot,Jpa,当我尝试同时执行以下两条SELECT语句时,日志控制台返回一个运行时错误: sql.SQLSyntaxErrorException:您的sql语法有错误;请查看与您的MySQL服务器版本对应的手册,以了解在“SELECT*FROM”附近使用的正确语法 生成语句的Java源代码: @Repository public class VehicleObjectDbAccess { @PersistenceContext EntityManager entityManager;

当我尝试同时执行以下两条SELECT语句时,日志控制台返回一个运行时错误:

sql.SQLSyntaxErrorException:您的sql语法有错误;请查看与您的MySQL服务器版本对应的手册,以了解在“SELECT*FROM”附近使用的正确语法

生成语句的Java源代码:

@Repository
public class VehicleObjectDbAccess {
    @PersistenceContext
    EntityManager entityManager;

    public List<Object[]>  getObjectById(long objectId, long year)     
    {
        int limit = 10;
        String tableName = ("i0i"+year)+objectId;
        String queryText =
            "START TRANSACTION;"
            + "SELECT t.created INTO @startTime FROM ObjectTable as t WHERE t.speed > 30 LIMIT 1;"
            + "SELECT * FROM ObjectTable WHERE created <= (CASE WHEN @startTime IS NULL THEN NOW() ELSE @startTime END) ORDER BY created DESC LIMIT 10;"
            + "COMMIT;";

        Query query = this.entityManager.createNativeQuery(queryText);
        return query.getResultList();
    }
}
最后,上面的java源代码转换为

START TRANSACTION; 
SELECT t.created INTO @startTime FROM ObjectTable as t WHERE t.speed > 30 LIMIT 1;
SELECT * FROM ObjectTable WHERE created <= (CASE WHEN @startTime IS NULL THEN NOW() ELSE @startTime END) ORDER BY created DESC LIMIT 10; 
COMMIT;
我验证了在MySQL客户机上运行它的SQL代码,并且它工作正常


如何在一个查询中执行这两个SELECT语句?

似乎可以将复合sql查询划分为两个单独的SELECT查询:

 Query query1 = this.entityManager.createNativeQuery(queryText1);
 Query query2 = this.entityManager.createNativeQuery(queryText2);
之后,您可以从中获取结果列表,并将结果列表添加到一个复合列表中:

 List<Object[]> result = new ArrayList<>();
 result.addAll(query1.getResultList());
 result.addAll(query2.getResultList());

只需使用一个select语句:

SELECT *, (SELECT t.created FROM ObjectTable as t WHERE t.speed > 30 LIMIT 1) as x FROM ObjectTable WHERE created <= 
  (CASE WHEN x IS NULL THEN NOW() 
   ELSE x
  END) 
  ORDER BY created DESC LIMIT 10;

如果出于某种原因不想执行此操作,请创建一个返回结果集的存储过程并调用它…

我希望避免嵌套的SELECT语句。为了简单起见,我问题中的查询被缩短了。实际查询较长。将它们组合到一个嵌套的SELECT语句中会使查询不可读。请参阅我的编辑-在数据库中创建存储过程并调用它-这将是我的选择。不幸的是,我不能使用存储过程,因为数据库表的名称将是动态的,MySQL不允许我在过程中随时指定表名。所以请使用嵌套选择。您将花费大量时间试图使解决方案的3-5行具有可读性,这是非常主观的,快速且正确。在某种程度上,它必须起作用,这样你才能继续做其他事情。我想避免将它们分成块,因为这样做会导致更大的计算时间。我的目标是最快的执行时间。程序员浪费大量时间考虑或担心他们程序中非关键部分的速度-Donald Knuth在Go-to语句结构化编程中-1974