次のコードを基準ビルダーの "in"演算子に変換する方法を教えてください。 "in"を使ってユーザ名のリスト/配列を使ってフィルタリングする必要があります。JPA CriteriaBuilder - "IN"比較演算子の使用方法
また、JPA CriteriaBuilderを使用して検索しようとしましたが、「in」メソッドでは良好な結果が見つかりませんでした。 このトピックの参照URLを私に教えていただければ幸いです。ありがとう。
は、ここに私のコードです:
//usersList is a list of User that I need to put inside IN operator
CriteriaBuilder builder = getJpaTemplate().getEntityManagerFactory().getCriteriaBuilder();
CriteriaQuery<ScheduleRequest> criteria = builder.createQuery(ScheduleRequest.class);
Root<ScheduleRequest> scheduleRequest = criteria.from(ScheduleRequest.class);
criteria = criteria.select(scheduleRequest);
List<Predicate> params = new ArrayList<Predicate>();
List<ParameterExpression<String>> usersIdsParamList = new ArrayList<ParameterExpression<String>>();
for (int i = 0; i < usersList.size(); i++) {
ParameterExpression<String> usersIdsParam = builder.parameter(String.class);
params.add(builder.equal(scheduleRequest.get("createdBy"), usersIdsParam));
usersIdsParamList.add(usersIdsParam);
}
criteria = criteria.where(params.toArray(new Predicate[0]));
TypedQuery<ScheduleRequest> query = getJpaTemplate().getEntityManagerFactory().createEntityManager().createQuery(criteria);
for (int i = 0; i < usersList.size(); i++) {
query.setParameter(usersIdsParamList.get(i), usersList.get(i).getUsername());
}
List<ScheduleRequest> scheduleRequestList = query.getResultList();
内部クエリ文字列
は以下に変換され、それが使用して「AND」されているので、私は、二人のユーザーによって作成されたレコードを得ることはありません。select generatedAlias0 from ScheduleRequest as generatedAlias0 where (generatedAlias0.createdBy=:param0) and (generatedAlias0.createdBy=:param1) order by generatedAlias0.trackingId asc
こんにちはperissf、あなたの返信のおかげで。私は、 "ScheduleRequest_"は何ですか、お願いできますか?どのように私はそれを作成するのですか? – Jemru
JPAプロバイダによって自動生成されたMetamodelクラスです。 Hibernateを使用している場合は、このリンクを参照してください。http://docs.jboss.org/hibernate/jpamodelgen/1.0/reference/en-US/html_single/ – perissf
疑似コードを読むと、タイプの不一致が考えられます。 userNames(String)またはuserIds(Integer/Long)に参加していますか? Pls私に私の答えを更新できるように私に教えてください – perissf