2013-06-20 45 views
1

我有以下问题,这不包括在Hibernate documentation。或者我在那里找不到答案。谷歌搜索并没有给我的细节也。实体对象作为HQL参数

如果我们使用Entity对象作为参数并使用Query.setParameter将其绑定到HQL,接下来会发生什么?

  • hibernate是否只使用映射参数对象的实体ID来构建SQL'where'查询?
  • 或者Hibernate使用一些额外的逻辑(可能在某些情况下),它不仅限于ID?例如,hibernate在SQL中添加不是主键的附加字段。
  • 使用分离的实体对象作为参数是危险的吗?

预先感谢您!

+0

我觉得hibernate使用id的相关对象,但它可以是aplaid只有对象,它有命名属性id,它会在sql中加入连接。当你通过它的id对象引用实体时,hibernate将不会使用join。此外,用作参数的对象必须附加到会话中。 –

+0

你认为如果一个对象没有附加到一个会话中,会抛出异常?它看起来像我们的应用程序中没有发生异常,并且对象被分离。我不确定这是否正常,我不应该附加保存数据库流量的对象。 – Sqeezer

+0

我不确定这一点,但如果它的工作,你可以使用它。但我认为直接使用对象属性来设置参数会更好。 object.anotherobject.id = comparatorobject.id –

回答

0

就SQL而言,它将简单地使用ID进行比较。您绑定的实体不必在该会话中进行管理,因为您的问题的评论暗示了这一点。

本质上发生的是,Hibernate将尝试解析它给出的实体实例的实体类型。然后它将使用该类型来绑定JDBC参数值,该参数值将只写入标识符。所以这里的假设是实体实例可以解析为它的“实体类型”。在大多数情况下,这通常很容易。在Hibernate特有的“实体名称”功能的情况下,它变得困难。