Hibernate Criteria查询以及如何有效地连接数据?

时间:2012-03-12 19:15:56

标签: sql hibernate native criteria

“这是我想要转向CRTIERIA的SQL:

选择be。*来自BlogEntry加入博客b on be.blog = b.id加入关注者f on b.id = f.blogId其中be.publishStatus ='published'和be.secured = false f.user =? union选择be1。*来自BlogEntry be1加入SecureUser s be1.id = s.blogEntryId加入用户u on s.userProfile = u.userProfile和u.id =?按publishDate desc“;

命令 亲爱的,伙计们。我一直在尝试使用HQL和本机SQL来执行上面的查询,而且我一直都很沮丧,因为在大多数情况下,在Hibernate中做UNION是非常尴尬的。即使您尝试SQLQuery,您仍然可以通过FORCED来包含SQL中引用的每个子类的每个属性,从而完成建立实体关系的麻烦。事实证明这是一个彻底的痛苦。

所以,我正在转向可能的标准查询解决方案,但我想我需要一些帮助。下面的查询在MySQL工作台上完全没问题,而且快速闪电。我试图克服条件查询的驼峰是我的一些实体关系是由表中的外键引用定义的,有些则不是。当他们是,我当然可以做这样的事情(在UNION之前评估我的部分查询):

ExtendedDetachedCriteria entryDetachedCriteria = extendedDetachedCriteria.forClass(BlogEntry.class); entryDetachedCriteria.createAlias( “blogEntry”, “blogEntry”); entryDetachedCriteria.createAlias(“blogEntry.blog”,“blog”);

等等...

但是,当我以不同的方式加入数据时,就像在SQL的这一部分中一样:

从BlogEntry中选择be1。* be1。在be1.id = s.blogEntryId上加入SecureUser(没有在表中定义的实际外键关系,SecureUser实体在创建时只标记了相关的BlogEntry ID)

我应该如何以与上述方式不同的方式编写标准查询?

我意识到像这样的问题是一个彻头彻尾的痛苦,如果你还没有亲自试图解决这个问题 - 请原谅我所问的问题的复杂性。我会非常感谢任何人可以提供的任何指导,即使它是“让你的冬眠行动在一起,你也可以!”。此刻陷入困境。

1 个答案:

答案 0 :(得分:0)

createAlias使用实体之间的关联创建内部联接。所以,

 criteria.createAlias("blogEntry","blogEntry"); 

等同于以下HQL:

inner join rootEntity.blogEntry as blogEntry.

根实体是BlogEntry。我猜你在blogEntry实体中没有BlogEntry字段。所以这条线没有意义。

如果两个实体之间没有任何关联,则无法进行连接。您已经沦为在where子句中以两个字段之间的相等形式进行内部连接:

select be1 from BlogEntry be1, SecureUser s 
where be1.id = s.blogEntryId

但由于Criteria只允许从一个根实体和一系列连接的关联中进行选择,因此使用Criteria无法做到这一点。

你最好的赌注是:

  • 在SQL中执行
  • 使用2个单独的HQL查询来完成,并使用Java加入结果。