Java SpringBoot,JPA/Hibernate:如何同时执行两个原始SELECT查询?
当我尝试同时执行以下两条SELECT语句时,日志控制台返回一个运行时错误: sql.SQLSyntaxErrorException:您的sql语法有错误;请查看与您的MySQL服务器版本对应的手册,以了解在“SELECT*FROM”附近使用的正确语法 生成语句的Java源代码: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;
@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