【问题标题】:JPA/HQL native query from string来自字符串的 JPA/HQL 本机查询
【发布时间】:2014-01-14 09:57:14
【问题描述】:

例如,我将此查询部分作为预定义的温度。

String temp = "select st from xxxx st where "

后面还有 if else 运算符。

if (c>v)temp += "yyy is null";
else temp += "yyy = 2";
Query query = em.createNativeQuery(temp);

堆栈跟踪异常:

javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute query

也许我做错了?

【问题讨论】:

  • 如果某些表和架构是预定义的,并且 em 是 EntityManager
  • 如果要在WHERE 子句中添加条件,则应使用AND
  • 做一个“本机”查询或 JPQL 查询,请下定决心;您当前创建了 JPQL,但作为本机调用。
  • 对不起,作为一个初学者......其实哪种类型的查询都没有关系
  • 如果“哪种类型的查询无关紧要”,那么请确定问题是针对哪一个,然后人们可以专注于该类型。如果这是本机的,那么您的查询应该是 SQL,因此请将您传入的 SQL 提供给“createNativeQuery”。与初学者或其他无关,请把问题定义清楚,然后你就会得到解决方案

标签: java sql hibernate jpa hql


【解决方案1】:

尝试这样,只需将 yyy 变量放在 if 条件中,因为它在您的查询中重复

String temp = "select st from xxxx st where "

if (c>v)
    temp += "yyy is null";
else 
    temp += "yyy = 2"

Query query = em.createNativeQuery(temp);

【讨论】:

    【解决方案2】:

    where语句中的多个子句用and分隔:

    else temp += " and yyy = 2"
    

    本机 SQL 查询也不使用 select 子句中的别名来选择它们使用的所有列 *

    String temp = "select * from xxxx st where "
    

    【讨论】:

    • @undefined 在问题中输入错误?还是实际代码?你的问题解决了吗?
    • 有问题,添加了我错过的所有内容
    【解决方案3】:

    我猜这是因为您忘记了 yyy 之前的 st. 标识符 或者可能是因为您只选择了st,但应该选择st.*

    应该是select st.* from xxxx st where st.yyy is null

    请使用hibernate属性show_sql = true跟踪生成的SQL并在此处发布

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多