1
Eclipselink 2.4.1을 사용하여 일괄 쿼리에 "distinct"키워드가 나타나지 않도록했습니다. 문서에서는 일괄 처리 유형 EXISTS를 사용할 때 distinct 키워드가 사용되지 않지만 내 경험상 다차원 관계를 검색 할 때 모든 경우에 사용된다는 것을 암시합니다. 예를 들어, 나는 오라클의 SCOTT 데모 스키마에 대해 다음과 같은 클래스를 작성했습니다 :일괄 쿼리에서 고유 키워드 피하기
@Entity
public class Emp implements Serializable {
@Id private long empno;
private String ename;
@ManyToOne
@JoinColumn(name="DEPTNO")
private Dept dept;
public Emp() { }
public long getEmpno() { return this.empno; }
public void setEmpno(long empno) { this.empno = empno; }
public String getEname() { return this.ename; }
public void setEname(String ename) { this.ename = ename; }
public Dept getDept() { return this.dept; }
public void setDept(Dept dept) { this.dept = dept; }
}
@Entity
public class Dept implements Serializable {
@Id private long deptno;
private String dname;
public Dept() {}
public long getDeptno() { return this.deptno; }
public void setDeptno(long deptno) { this.deptno = deptno; }
public String getDname() { return this.dname; }
public void setDname(String dname) { this.dname = dname; }
}
내가 가져 배치를 통해 직원 및 부서를 검색하려고 해요 :
Query query = em.createQuery("select emp from Emp as emp ");
query.setHint(QueryHints.BATCH_TYPE, BatchFetchType.EXISTS);
query.setHint(QueryHints.BATCH, "emp.dept");
List<Emp> resultList = query.getResultList();
resultList.get(0).getDept();
다음 SQL이 생성됩니다 :
[EL Fine]: sql: 2012-12-12 17:04:21.178--ServerSession(1034011695)--Connection(312759349)--SELECT EMPNO, ENAME, DEPTNO FROM SCOTT.EMP
[EL Fine]: sql: 2012-12-12 17:04:21.286--ServerSession(1034011695)--Connection(312759349)--SELECT distinct t0.DEPTNO, t0.DNAME FROM SCOTT.DEPT t0 WHERE EXISTS (SELECT t1.EMPNO FROM SCOTT.EMP t1 WHERE (t0.DEPTNO = t1.DEPTNO))
배치 쿼리에서 별개의 키워드를 방지하기 위해 존재 배치 유형을 사용하여 추가로 수행해야 할 추가 뭔가가 있나요?
DISTINCT 키워드 사용시 우려되는 점은 무엇입니까? – northpole
쿼리에서는 불필요하며,이 예제보다 테이블이 몇 개 더있는, 관심이있는 경우 쿼리 계획이 잘못되었습니다. – cogitos