【问题标题】:Using hibernate named parameter twice两次使用休眠命名参数
【发布时间】:2013-04-27 11:19:48
【问题描述】:

假设我有以下 HQL

EntityManager.createQuery("SELECT a FROM a WHERE a.b = :par OR a.c = :par").setParameter("par", obj);

似乎不起作用。有人知道如何仅使用一个参数来解决此问题吗?

【问题讨论】:

  • 你得到什么错误?
  • 没有错误。结果列表只是空的。
  • 您有有效数据吗?尝试在 persistence.xml 中启用 - showsql = true 并获取原始 sql
  • 数据有效。当我只使用“OR”的左侧或右侧时,一切正常
  • 好吧,我很确定它将第一个参数设置为正确,然后它只执行查询而没有第二个参数。你可以设置参数,比如*.setParameter(0, par)*.setParameter(1, par)

标签: java hibernate jpa


【解决方案1】:
setParameter(String name,Object val)

这用于将值绑定到命名参数。但是一个名称可以在一个无关紧要的查询中出现多次。因此,请检查一下您是否真的有该查询的数据。

查看文档here

该文档中的一些主要文本

命名查询参数是查询字符串中 :name 形式的标记。通过调用将值绑定到整数参数 :foo setParameter("foo", foo, Hibernate.INTEGER); 例如。一个名称可能在查询字符串中出现多次。

如果你仍然没有得到结果,那么只需尝试使用两个名称并设置它

EntityManager.createQuery("SELECT a FROM a WHERE a.b = :par1 OR a.c = :par2").setParameter("par1", obj).setParameter("par2", obj);

【讨论】:

  • 这完全正确。似乎查询有点坏了。 DBMS 通过本机 sql 也有一个空的结果列表。 +1 对于这个很好的描述
【解决方案2】:
setParameter(String name,Object val)

替换查询中指定的所有出现的名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-21
    • 2015-09-13
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多