休眠和准备好的语句
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 以用作条件查询中的子选择。
【讨论】:
以上是关于休眠和准备好的语句的主要内容,如果未能解决你的问题,请参考以下文章