0

HQL を使用して動的クエリを作成していますが、パラメーターが多いため、Criteria の方がはるかに「読みやすい」と思います。クエリは次のようになります。

String queryString = "select u from ReportSalesUnit as r join r.recipients as u where r.id = :reportSalesUnitId";
if ( firstName != null )
{
    queryString += " and lower(u.firstName) like :firstName";
}
if ( lastName != null )
{
    queryString += " and lower(u.lastName) like :lastName";
}
if ( email != null )
{
    queryString += " and lower(u.email) like :email";
}
if ( phoneNr != null )
{
    queryString += " and u.phoneNr like :phoneNr";
}
Query query = session.createQuery( queryString );
if ( firstName != null )
{
    query.setParameter( "firstName", firstName.toLowerCase() + "%" );
}
if ( lastName != null )
{
    query.setParameter( "lastName", lastName.toLowerCase() + "%" );
}
if ( email != null )
{
    query.setParameter( "email", email.toLowerCase() + "%" );
}
if ( phoneNr != null )
{
    query.setParameter( "phoneNr", phoneNr + "%" );
}
query.setParameter( "reportSalesUnitId", reportSalesUnitId );

正直なところ、Criteria に関連付けられた結合を返す方法がわかりません。ここで答えを探していましたが、見つかりませんでした: http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html、誰か助けてくれませんか? 少しの説明は素晴らしいでしょう。

4

1 に答える 1

0

基準は次のようにも使用できます。

...
if(firstName != null) {   
   criteria.add(Restrictions.and(
      Restrictions.isNotNull("firstName"), Restrictions.eq("firstName", firstName.toLowerCase());
...

どうやら、多くの条件付きで読みやすくなるわけではありません。しかしCriteria、この方法であなたを助けるかもしれません:

Criteria/Query作成に到達する前に、ヌル (またはその他の例外) を事前にチェックする必要があります。最終的に、以下のようなコードが得られます。これで問題ないと思います。

... 
criteria.add(Restrictions.eq("firstName", firstName.toLowerCase()));
criteria.add(Restrictions.eq("phoneNr", phoneNr));
...
criteria.list();

また、次のようなエイリアスを使用して結合を作成したり、データをフェッチしたりできます。

criteria.createAlias("recipients", "recipients", JoinType.LEFT_OUTER_JOIN);

また

criteria.createAlias("recipients", "recipients");
        .setFetchMode("recipients", FetchMode.JOIN);

according to your needs.
于 2012-10-23T11:40:43.703 に答える