【问题标题】:Use MySQL variables and assignments in hibernate在 hibernate 中使用 MySQL 变量和赋值
【发布时间】:2017-03-28 00:59:09
【问题描述】:

我创建了以下查询,该查询现在位于 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 变量,所以不确定我是否遗漏了什么以及是否需要“准备”和“执行”?

有更多知识的人可以指出我哪里出错了吗?

另外,在我选择 Q1 的地方,我把它放在单引号中,在 MySQL 工作台中它是双引号。

编辑:我添加了双引号,因此 hibernate 不会对分配产生娘娘腔。我仍然不能为我的生活,弄清楚为什么我准备好之后不能只使用'@sql'。

编辑:我收到以下错误:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在 'PREPARE stmt1 from @sql_max; 附近使用的正确语法;在第 1 行执行 stmt1'

谢谢

【问题讨论】:

    标签: java mysql sql sql-server hibernate


    【解决方案1】:

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

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

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

    由于您查询的复杂性,我想说有一些我可以想到的选项:

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

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

    3. 创建一个函数/过程(这是可能的)并使用CallableStatement调用它

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

    在查询中混合特定的数据库提供程序代码(如您的示例)看起来不是一个好习惯。

    如果可能,我肯定会选择选项 2。如果无法完成,肯定会选择 3。

    希望对你有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-05
      • 2018-10-11
      • 2011-02-28
      相关资源
      最近更新 更多