休眠和准备好的语句

Posted

技术标签:

【中文标题】休眠和准备好的语句【英文标题】:Hibernate and prepared statement 【发布时间】:2015-05-22 10:57:21 【问题描述】:

据我在谷歌上找到的,hibernate 使用PreparedStatement 进行查询。

我需要执行一个由两部分组成的查询,第一部分可以用hibernate条件编写,第二部分是dblink查询,因此不能使用hibernate。

所以,我想从 Criteria 对象中提取 PreparedStatement 对象。

Criteria criteria = getSession().createCriteria(Entity.class);
//adding restrictions
PreparedStatement stmt;
//initializing stmt with criteria's PreparedStatement

我该怎么做? 有没有可能?

【问题讨论】:

这是不可能的,因为它是内部实现,并且没有获取Statement的API。 【参考方案1】:

这对于当前的 Hibernate API 是不可能的。而且无论如何都很难增加对它的支持。例如,要在没有任何其他限制的情况下执行 getSession().createCriteria(Entity.class),Hibernate 可能需要生成多个 PreparedStatement(根据为 Entity 类定义的获取计划和策略来获取 Entity 及其所有关联)。

此外,如果存在类似的事件,您将很难实施和维护这样的解决方案事件。您可能需要解析生成的语句才能“注入”您的查询部分。或者,当您修改实体或根据持久性上下文的当前状态(不再获取会话中已经存在的内容,因此查询不同等)时,生成的语句可能会发生变化。将 Hibernate 升级到新版本时也需要小心,因为生成的查询的确切结构可能会发生变化。

可能还有很多其他的障碍暂时很难实现,但我认为你的推理是好的,希望 Hibernate 将来会公开某种 API,让我们有更大的影响力在生成的 SQL 上。

【讨论】:

【参考方案2】:

在与您的表相同的架构中创建一个使用 dblink 查询的视图。

然后创建一个映射到您的视图的实体。

然后,您可以创建一个 DetachedCriteria 以用作条件查询中的子选择。

【讨论】:

以上是关于休眠和准备好的语句的主要内容,如果未能解决你的问题,请参考以下文章

JFrame:在语句之间休眠

睡眠 休眠 关闭硬盘 分别是啥意思?

在没有选择语句的情况下强制休眠插入

使用正则表达式语句在休眠中使用 createSQLQuery 获取计数(*)

休眠和 SQL 注入

休眠 Java:未找到函数“AES_DECRYPT”; SQL 语句: