2017-12-21 5 views
0

パラメータ:いくつかのケースではJAVA EclipseLinkのオプションのクエリは、私は特定の条件でアイテムをフィルタクエリを持って

@NamedQueries({ 
     @NamedQuery(
       name = ITEM.FIND_ALL_PARAMS_BY_COMPANY_COUNTRY_GROUP, 
       query = "SELECT i FROM Item i where " 
         + "((i.idCompany=:companyId AND i.idEMGroup=:groupId) " 
         + "OR (i.idCompany=:companyId AND i.idEMCountry =:countryId AND i.idEMGroup is null) " 
         + "OR (i.idCompany is null AND i.idEMCountry = :countryId AND i.idEMGroup is null)) " 
         + "order by i.idEMCountry desc, i.idCompany desc, i.idEMGroup desc") 
}) 

idEMGroupパラメータ企業ID oをこのIdEmCompany = 200630758) AND (IdEMGroup = NULL)ように見えるSQLを生成し、それどのnullにすることができますが正しくありませんsql構文は、値がnullの場合は'Column = NULL'の代わりに'Column IS NULL'と動的に可能ですが、多くのifを追加しないと、このクエリを書き直すのが良いでしょうCriteria APIと値が存在するかどうかを確認して、特定の条件に述語を追加しますか?

答えて

1

正解はCriteriaQueryです。

クエリを動的に作成することもできますが、@NamedQueryを操作することはできません。また、行う価値がないことが必要な場合もあります。

代わりにあなたが最初Stringとしてクエリを作成し、クエリ文字列を操作することにより、TypedQueryを作成することができ

String strQuery = "SELECT i FROM Item i"; // .. + the rest of stuff 
if(null==companyId) { 
    // add something like "companyId IS :companyId" 
    // ":companyId" coulöd also be NULL" 
    // but to enable using tq.setParameter("companyId", companyId) 
    // without checking if there is param "companyId" so there always will 
} else { 
    // add something like "companyId=:companyId" 
} 
TypedQuery<Item> tq = entityManager.createQuery(strQuery, Item.class); 
tq.setParameter("companyId", companyId); 

あり、いくつかのIFのだろうが、そうもCriteriaQuery建設になります。

関連する問題