2012-12-13 3 views
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)) 

배치 쿼리에서 별개의 키워드를 방지하기 위해 존재 배치 유형을 사용하여 추가로 수행해야 할 추가 뭔가가 있나요?

+1

DISTINCT 키워드 사용시 우려되는 점은 무엇입니까? – northpole

+0

쿼리에서는 불필요하며,이 예제보다 테이블이 몇 개 더있는, 관심이있는 경우 쿼리 계획이 잘못되었습니다. – cogitos

답변

1

버그를 기록하십시오. JOIN 일괄 처리에만 이것을 사용해야합니다.

쿼리를 피하기 위해 쿼리에서 distinct를 false로 설정할 수 있습니다. (힌트가 없다면 루트 ObjectLevelReadQuery에서 dontUseDistinct()를 호출해야합니다.

((ObjectLevelReadQuery)((JpaQuery)query).getDatabaseQuery()).dontUseDistinct(); 
관련 문제