2016-08-17 12 views
0

私はここで説明するように名前付きクエリのような動的クエリを再利用しようとしています:JPA 2.1/EclipseLinkの:再使用基準クエリの名前付き問合せとして

https://wiki.eclipse.org/EclipseLink/Release/2.5/JPA21#Add_Named_Query

目標は、一度だけ基準-クエリを構築することですパラメータが変更されなかった場合は、名前付きクエリとして再利用します。 namedQueryが最初に存在していないとして、これはnullポインタになり

public static List<User>getUserByParameter(ParameterMap parameter){ 

    Query userByParameter = em.createNamedQuery("userByParameter"); 
    if (null != userByParameter){ 
    return userByParameter.getResultList(); 
    }else { 
     //build the dynamic query as above 
    } 
} 

:私は何かについて考え

public static List<User>getUserByParameter(ParameterMap parameter){ 
    EntityManager em = getEntityManager(); 
    CriteriaBuilder builder = em.getCriteriaBuilder(); 
    CriteriaQuery<User> criteriaQuery = builder.createQuery(User.class); 

    Root<User> user = criteriaQuery.from(User.class);  

    List<Predicate> predicates = new ArrayList<Predicate>(); 

    //...build up the query depending on parameter 
    if (null != parameter.getStatus()){ 
    predicates.add(builder.equal(user.<Integer>get("status"), parameter.getStatus())); 
    } 
    //etc. 

criteriaQuery.select(user).where(predicates.toArray(new Predicate[]{})); 

Query query = em.createQuery(criteriaQuery); 

//now register this query as a namedQuery 
em.getEntityManagerFactory().addNamedQuery("userByParameter", query); 

return query.getResultList();  
} 

同じ方法でクエリを再利用するにはどうすればよいですか?つまり、名前付きクエリが存在する場合、どのようにして(try-catchを使用せずに)きれいにチェックすることができますか?

+0

** "パラメータ値は保持されません" **これは、ここで意味をなさない各ユーザーに対して同じ結果(一度名前付きクエリとして定義されます)が返されることを意味します。 – Steve

答えて

0

あなたが解決しようとしている問題を理解しているかどうかはわかりません。 getUserByParameterメソッドは、EntityManagerFactoryが最初に初期化または取得されるときに、EntityManagerFactoryで構築する必要があります。すでに追加したものを追跡したい場合は、工場にプロパティを自由に追加してください。ただし、これらは初期化中に一度だけ前処理する必要があります。

紛らわしいのは、クエリ結果を再利用することを期待していることです。名前付きクエリは、クエリの解析と準備のコストを削減するために設計されています。同じパラメータが使用されている場合、クエリ、パラメータ、および結果を自分でキャッシュする必要はなく、結果を返すことができるquery cache featureがEclipseLinkにあります。

関連する問題