我创建了以下查询,该查询现在位于我的Hibernate使用的一个java类中。
private static final String COUNT_INTERQUARTILE_SQL
= " SET @number_of_rows \\:= (SELECT COUNT(*) FROM carecube.visit)" +
" SET @quartile \\:= (ROUND(@number_of_rows*0.25))" +
" SET @medianquartile \\:= (ROUND(@number_of_rows*0.50))" +
" SET @sql_q1 \\:= (CONCAT('(SELECT 'Q1' AS quartile, visit.id FROM carecube.visit order by visit.id LIMIT 1 OFFSET ', @quartile, ')'))" +
" SET @sql \\:= (CONCAT_WS(' UNION ', @sql_q1, @sql_med))" +
" PREPARE stmt1 from @sql;" +
" EXECUTE stmt1;";`
堆栈跟踪抱怨我设置了mysql变量的每一行的语法错误。显然它在MySQL中运行得很好。
我读到我可以在Hibernate中使用带有赋值的双反斜杠。这是我第一次尝试在Hibernate中使用MySQL变量,所以不确定我是否遗漏了任何内容以及是否需要“PREPARE”和“EXECUTE”?
有更多知识的人可以指出我哪里出错了吗?
另外,在我选择Q1的地方,我把它放在单引号中,在MySQL工作台中它是双引号。
编辑:我添加了双引号,因此hibernate不会对分配产生任何麻烦。我仍然不能为我的生活,弄清楚为什么我在准备之后不能只使用'@sql'。编辑:我收到以下错误:
您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在@sql_max的'PREPARE stmt1附近使用正确的语法;在第1行执行stmt1'
由于
答案 0 :(得分:0)
我不确定这是否可行,但在我看来这没有多大意义。
有些人问了类似的问题(如果你想检查,他们在答案中有一些代码示例):
Hibernate是一个ORM(对象关系映射),因此它应该在对象中的不兼容类型系统(来自数据库的数据)之间转换数据。至于我能理解你的查询,你将返回一个COUNT,所以它只是一个结果(行)和一个单一列,是吗?
由于查询的复杂性,我想说有一些我能想到的选择:
使用Criteria
或HQL
使用Hibernate运行每个查询,然后在Java中使用逻辑来获得所需的结果(可能比MySQL中的查询慢得多)
使用此SELECT创建一个VIEW(如果可能),map it into an object创建@Entity
并直接查询
创建一个功能/程序(这是可能的)并使用CallableStatement
我喜欢认为这里的两个元素(Hibernate x Database)应该在项目中有明确的责任。首先,我会尝试仅使用Criteria / HQL进行查询(使用对象属性),但如果需要使用SQL,我会保留所有查询ANSI以允许互操作性。如果不可能,我会在数据库中创建一个对象来返回我想要的东西(view / procedure / function)。
在查询中混合特定的数据库提供程序代码,就像您的示例一样,看起来不太好。
如果可能的话,我肯定会选择选项2.如果不能这样做,肯定是3号。
希望它有所帮助。