Hibernate和准备好的声明

时间:2015-05-22 10:57:22

标签: java hibernate jdbc

据我所知,谷歌的hibernate使用PreparedStatement进行查询。

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

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

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

我该怎么做? 它甚至可能吗?

2 个答案:

答案 0 :(得分:3)

使用当前的Hibernate API无法做到这一点。而且无论如何都很难为它添加支持。例如,要执行getSession().createCriteria(Entity.class)而没有任何其他限制,Hibernate可能需要生成多个PreparedStatement(以获取Entity及其所有关联,基于{{1}的已定义获取计划和策略} class)。

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

可能还有很多其他障碍会使目前难以实现这一目标,但我认为你的推理很好,希望Hibernate将来会暴露某种API,这将使我们有更大的影响力在生成的SQL上。

答案 1 :(得分:3)

创建一个在与表相同的模式中使用dblink查询的视图。

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

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