hibernate查询的条件部分

时间:2013-01-15 13:24:44

标签: hibernate hql

这是复杂查询的简化。

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

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

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

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

NewsWf一对多NewsWfL​​ocal

NewsWfL​​ocal一对一NewsWfL​​ocalFiles

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

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>

2 个答案:

答案 0 :(得分: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=...,会产生错误(因为hibernate 3.3),因为local.files是一对多的。

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

答案 1 :(得分:0)

我发现这是一个关注hibernate处理一对一/零映射的方式的问题。

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

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

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

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