0

これは、複雑なクエリを簡略化したものです。

具体的な event-new (渡された既知の 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");

重要なのは定型文を適切に構築することだと思いますが、その方法がわかりません。

テーブル間の関係は次のとおりです。

ニュース 1 対多 NewsWf

NewsWf 1 対多 NewsWfL​​ocal

NewsWfL​​ocal 1 対 1 NewsWfL​​ocalFiles

次のフォーム句では、解決策に近づいていると感じていますが、フィールドが空ではない場合でも、取得された「localFile」はまだ null です。

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

1 対 1 のマッピングの詳細は次のとおりです。

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

    }
}

Hibernate では、結合は、エンティティで定義された多対 1/1 対 1/1 対多の関連付けを使用してのみ可能です。

Query query = session.createQuery("select news from News news "
           +"join news.wf wf "
           +"join wf.local local "
           +"join local.files file ")

1 対 1 および多対 1 の場合、結合は暗黙的に行われます。

Query query = session.createQuery("select news from News news "
           +"where news.id=:id and news.wf.local.id=:idLocal ")

これにより、3 つのテーブルが暗黙的に結合されます。local.filesnews.wf.local.files.name=...は 1 対多であるため、(hibernate 3.3 以降) エラーが発生します。

http://docs.jboss.org/hibernate/orm/3.5/reference/en/html/queryhql.html#queryhql-joinsを参照してください

于 2013-01-15T15:58:11.817 に答える
0

これは、休止状態が1 対 1/ゼロのマッピングを処理する方法に関する問題であることを発見しました。

Google で見つけたいくつかのトリッキーな手法は、私にはうまくいきません。

その 1 対 1/ゼロ (NewsWfL​​ocal と NewsWfL​​ocalFiles の間) のマッピングを1対多の関係に変更すると、問題が解決します。

ファイルが関連付けられていない newsWfsLocal インスタンスには、左外部結合が引き続き必要です

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