在休眠中使用MySQL变量和赋值

时间:2016-11-14 11:42:09

标签: java mysql sql sql-server hibernate

我创建了以下查询,该查询现在位于我的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'

由于

1 个答案:

答案 0 :(得分:0)

我不确定这是否可行,但在我看来这没有多大意义。

有些人问了类似的问题(如果你想检查,他们在答案中有一些代码示例):

Hibernate是一个ORM(对象关系映射),因此它应该在对象中的不兼容类型系统(来自数据库的数据)之间转换数据。至于我能理解你的查询,你将返回一个COUNT,所以它只是一个结果(行)和一个单一列,是吗?

由于查询的复杂性,我想说有一些我能想到的选择:

  1. 使用CriteriaHQL使用Hibernate运行每个查询,然后在Java中使用逻辑来获得所需的结果(可能比MySQL中的查询慢得多)

  2. 使用此SELECT创建一个VIEW(如果可能),map it into an object创建@Entity并直接查询

  3. 创建一个功能/程序(这是可能的)并使用CallableStatement

  4. 进行调用

    我喜欢认为这里的两个元素(Hibernate x Database)应该在项目中有明确的责任。首先,我会尝试仅使用Criteria / HQL进行查询(使用对象属性),但如果需要使用SQL,我会保留所有查询ANSI以允许互操作性。如果不可能,我会在数据库中创建一个对象来返回我想要的东西(view / procedure / function)。

    在查询中混合特定的数据库提供程序代码,就像您的示例一样,看起来不太好。

    如果可能的话,我肯定会选择选项2.如果不能这样做,肯定是3号。

    希望它有所帮助。