这是复杂查询的简化。
我想检索具体事件的详细信息 - new(使用已知的传递idNew)。
问题是我不知道如何告诉hibernate sql引擎我想要检索该记录的字段,独立于新的是否关联文件。
我不知道如何用最后一个句子写出conexion(和newsWfLocalFiles.idNewsWfLocal = newsWfLocal.idNewsWfLocal)
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一对多NewsWfLocal
NewsWfLocal一对一NewsWfLocalFiles
使用下一个表单子句,我觉得我接近解决方案,但检索到的'localFile'仍然为null,尽管在该字段不为空的情况下:
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>
NewsWfLocalFiles.xml :中的
<one-to-one name="newsWfLocal" class="com.sample.mdl.NewsWfLocal" fetch="select" lazy="false"></one-to-one>
答案 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中发现的一些棘手的技巧对我不起作用。
将一对一/零(在NewsWfLocal和NewsWfLocalFiles之间)映射到一对多关系可以解决问题。
对于没有关联文件的newsWfsLocal实例,仍然需要左外连接:
from News news join news.newsWfs newsWfs join newsWfs.newsWfsLocal newsWfsLocal left outer join newsWfsLocal.newsWfLocalFiles newsWfLocalFiles