10
JPA基準にクエリに参加し、私はJPA基準に変換しようとしている次のネイティブSQLクエリを持っている:変換は
select et.* from t_empl_tx et, t_dept d
where et.assigned_dept = d.dept (+)
and et.employee_id = :employee_id
and (et.start_date >= d.dept_est_date and
et.start_date <= d.dept_close_date or
et.start_date is null or
d.dept is null)
は(+(なお)の左外側とほぼ同じですはい、私はそれがOPTIONALテーブルなどを示していることを知っています。ここで
がコードで私の試みです:
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<EmployeeTransaction> criteriaQuery = criteriaBuilder.createQuery(EmployeeTransaction.class);
Root<EmployeeTransaction> root = criteriaQuery.from(EmployeeTransaction.class);
// this line bombs!
Join<EmployeeTransaction, Department> join =
root.join(EmployeeTransaction_.assignedDepartment).join(Department_.id).join(DepartmentCompositeId_.department, JoinType.LEFT);
List<Predicate> predicates = new ArrayList<>();
predicates.add(criteriaBuilder.equal(root.get(EmployeeTransaction_.id).get(EmployeeTransactionCompositeId_.employeeId), employeeId));
predicates.add(criteriaBuilder.or(
criteriaBuilder.and(
criteriaBuilder.greaterThanOrEqualTo(root.<Date>get(EmployeeTransaction_.requestedStartDate), join.get(Department_.id).<Date>get(DepartmentCompositeId_.departmentCreationDate)),
criteriaBuilder.lessThanOrEqualTo(root.<Date>get(EmployeeTransaction_.requestedStartDate), join.<Date>get(Department_.departmentCloseDate))
),
criteriaBuilder.isNull(root.get(EmployeeTransaction_.requestedStartDate)),
criteriaBuilder.isNull(join.get(Department_.id).get(DepartmentCompositeId_.departmentCreationDate))
));
criteriaQuery.select(root).where(predicates.toArray(new Predicate[]{}));
TypedQuery<EmployeeTransaction> query = entityManager.createQuery(criteriaQuery);
List<EmployeeTransaction> result = query.getResultList();
この問題は、私は、複合IDの単一のフィールドに、文字列、assigedDepartmentに参加しようとしているということのようです。これはSQLでは完全に正当ですが、コードではそれほど簡単ではありません。
1つのオプションは、複数のサブクエリに変換することです。サブクエリは、左外部結合のポイントを完全に消去するようです。
誰かが間違っていることを指摘できますか?
Jason
答えを書くための時間がないのが、 "エンティティ1からエンティティ1を選択し、左にエンティティ1を選択します。左の結合を熱心にフェッチする場合は、「左結合フェッチ」が必要です。 –
JoinType属性には、INNER、LEFT、およびRIGHTの3つの値しかありません。左結合フェッチのオプションがないようです。 また、join()行に問題があります。 join()がSingularAttribute <>を返しても、私はそのようなコマンドを連鎖させることはできません。 – Jason
JPA Criteriaクエリでは、SQLクエリには存在しない 'DepartmentCompositeId'テーブルを参照しています。各エンティティの定義の関連部分を追加して情報を完成してください – perissf