0

这是对复杂查询的简化。

我想检索一个具体的新事件的详细信息(具有已知的传递 idNew)。

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

我不知道如何用最后一个子句(和 newsWfL​​ocalFiles.idNewsWfL​​ocal = newsWfL​​ocal.idNewsWfL​​ocal)编写 conexion

Query query = this.sessionFactory.getCurrentSession().createQuery(
    "select news.idNews, newsWfLocal.title, newsWf.date, newsWfLocalFiles.url" +
    " from News news, NewsWf newsWf, NewsWfLocal newsWfLocal, NewsWfLocalFiles newsWfLocalFiles" +
    " where news.idNews = :idNews" +
    " and newsWf.news.idNews = news.idNews" +
    " and newsWf.idNewsWf = newsWfLocal.idNewsWf" +
    " and newsWfLocal.idLocal = 1" +
    " and newsWfLocalFiles.idNewsWfLocal = newsWfLocal.idNewsWfLocal");

我想关键是正确地构建表单句子,但我不知道该怎么做。

这些是表之间的关系:

新闻一对多 NewsWf

新闻Wf 一对多 新闻WfLocal

新闻WfLocal 一对一新闻WfLocalFiles

使用下一个表单子句,我觉得我接近解决方案,但检索到的“localFile”仍然为空,尽管在该字段不为空的情况下:

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

这里是一对一映射的详细信息:

NewsWfL​​ocal.xml中:

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

NewsWfL​​ocalFiles.xml中:

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

2 回答 2

1

你不需要完全写出你的 SQL,hibernate 会为你生成它。

我正在对您的实体进行一些假设,但这可能很简单,例如:

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())
    {

    }
}

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

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=...因为 local.files 是一对多的,所以会产生错误(自休眠 3.3 起)。

http://docs.jboss.org/hibernate/orm/3.5/reference/en/html/queryhql.html#queryhql-joins

于 2013-01-15T15:58:11.817 回答
0

我发现这是一个与休眠处理一对一/零映射的方式有关的问题。

在 Google 中发现的一些棘手技术对我不起作用。

将一对一/零(在 NewsWfL​​ocal 和 NewsWfL​​ocalFiles 之间)映射更改为一对多关系可以解决问题。

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

from News news join news.newsWfs newsWfs join newsWfs.newsWfsLocal newsWfsLocal left outer join newsWfsLocal.newsWfLocalFiles newsWfLocalFiles
于 2013-01-17T09:30:12.117 回答