hibernate查询的条件部分

hibernate查询的条件部分,hibernate,hql,Hibernate,Hql,这是一个复杂查询的简化 我想检索具体事件new的详细信息(使用已知传递的idNew) 问题是,我不知道如何告诉hibernate sql引擎我想要检索该记录的字段,这与新的是否有关联文件无关 我不知道如何使用最后一个子句(以及newsWfLocalFiles.idNewsWfLocal=newsWfLocal.idNewsWfLocal)编写连接 我想关键是正确地构建形式句子,但我不知道怎么做 以下是表之间的关系: 新闻一对多新闻 NewsWf一对多NewsWf本地 NewsWfLocal一对一

这是一个复杂查询的简化

我想检索具体事件new的详细信息(使用已知传递的idNew)

问题是,我不知道如何告诉hibernate sql引擎我想要检索该记录的字段,这与新的是否有关联文件无关

我不知道如何使用最后一个子句(以及newsWfLocalFiles.idNewsWfLocal=newsWfLocal.idNewsWfLocal)编写连接

我想关键是正确地构建形式句子,但我不知道怎么做

以下是表之间的关系:

新闻一对多新闻

NewsWf一对多NewsWf本地

NewsWfLocal一对一NewsWfLocalFiles

对于下一个form子句,我觉得我接近解决方案了,但是检索到的“localFile”仍然为空,尽管在这种情况下,该字段不是空的:

from News news join news.newsWfs newsWfs join newsWfs.newsWfsLocal newsWfsLocal left outer join newsWfsLocal.newsWfLocalFiles newsWfLocalFiles
下面是一对一映射的详细信息:

NewsWfLocal.xml中:

<one-to-one name="newsWfLocalFiles" class="com.sample.mdl.NewsWfLocalFiles" fetch="select" lazy="false" ></one-to-one>
<one-to-one name="newsWfLocal" class="com.sample.mdl.NewsWfLocal" fetch="select" lazy="false"></one-to-one>

NewsWfLocalFiles.xml中:

<one-to-one name="newsWfLocalFiles" class="com.sample.mdl.NewsWfLocalFiles" fetch="select" lazy="false" ></one-to-one>
<one-to-one name="newsWfLocal" class="com.sample.mdl.NewsWfLocal" fetch="select" lazy="false"></one-to-one>

您不需要完全写出SQL,hibernate将为您生成SQL

我对你们的实体做了一些假设,但可能很简单:

Query query = session.createQuery("select news from News news "
           +"join news.wf wf "
           +"where news.id=:id and wf.local=:local")
query.setParameter("id",id);
query.setParameter("local", local);
List list = query.list();
for(News news: list)
{
    if(!news.getWf().getLocal().getFiles().isEmpty())
    {

    }
}
在hibernate中,连接只能使用实体中定义的多对一/一对一/一对多关联,例如

Query query = session.createQuery("select news from News news "
           +"join news.wf wf "
           +"join wf.local local "
           +"join local.files file ")
对于一对一和多对一,连接甚至是隐式进行的

Query query = session.createQuery("select news from News news "
           +"where news.id=:id and news.wf.local.id=:idLocal ")
这将隐式连接三个表。 但是,这对一对多不起作用,就像
news.wf.local.files.name=…
,这会导致错误(自hibernate 3.3以来),因为local.files是一对多


请参见

我发现hibernate处理一对一/零映射的方式存在问题

在谷歌上找到的一些技巧对我不起作用

将一对一/零(NewsWfLocal和NewsWfLocal文件之间)映射更改为一对多关系可以解决问题

对于没有关联文件的newsWfsLocal实例,左外部联接仍然是必需的:

from News news join news.newsWfs newsWfs join newsWfs.newsWfsLocal newsWfsLocal left outer join newsWfsLocal.newsWfLocalFiles newsWfLocalFiles

谢谢可以在同一查询中混合显式联接和隐式联接吗?:
来自News News、NewsWf NewsWf、NewsWfLocal NewsWfLocal左外部联接NewsWfLocal。newsWfLocalFiles newsWfLocalFiles
添加了hibernate调用隐式联接的示例。这不是你所展示的。你没有实体关联News->NewsWf吗?我编辑了这篇文章来显示我映射的表和上次尝试之间的关联。谢谢,您需要双向一对一映射。您有两个hibernate不知道是相关的一对一关系,所以它可能在两个表中生成外键。对于双向一对一关系,需要使用属性ref或inverse=“true”将一伪装为多对一。看见