私はここで説明するように名前付きクエリのような動的クエリを再利用しようとしています: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を使用せずに)きれいにチェックすることができますか?
** "パラメータ値は保持されません" **これは、ここで意味をなさない各ユーザーに対して同じ結果(一度名前付きクエリとして定義されます)が返されることを意味します。 – Steve