2013-04-29 49 views
1

我使用HQL命名查询(在XML文件中定义)来使用Hibernate查询我的数据库。有些查询非常复杂,我发现自己将一个查询的大部分内容复制到另一个查询中,类似的查询。重用HQL命名查询片段

我想知道是否有可能在“命名查询片段”中定义公共部分并在所有查询中重用该片段?

我不想使用标准API,顺便说一句,因为我觉得用XML编写查询会更舒服。其中一些已经相当怪物了,用API实现它们会使它们变得更加难以理解。

回答

-1

您可以通过展开查询&来获取实现特定的对象,然后可以从中提取详细信息。

javax.persistence.Query query = entityManager.createNamedQuery(NAMED_QUERY_X); 
org.hibernate.Query hibernateQuery = query.unwrap(org.hibernate.Query.class); 
String sqlQuery = hibernateQuery.getQueryString(); 

javax.persistence.Query#解包:返回指定类型的对象,以允许访问所述提供者特定的API。如果提供者的查询 实现不支持指定的类,则会抛出 PersistenceException。

org.hibernate.Query#getQueryString:获取查询字符串。

+0

这将是一种可能性,但听起来有点像黑客。没有像MyBatis这样的原生HQL支持? – 2013-04-29 08:34:29

+0

@StefanHaberl我不熟悉MyBatis。如上所述,它取决于实现,提供者特定的API。但是你正在使用Hibernate,你试过了吗。 – 2013-04-29 09:22:04

+1

我认为它可以和Hibernate一起使用。这只是我不想在我的代码中与Hibernate生成的SQL搏斗。我想用XML中的命名查询构建块构建HQL查询,并且希望独立执行SQL方言。 – 2013-04-29 09:56:36