2

Eclipselink 2.4.1 を使用して、"distinct" キーワードがバッチ クエリに表示されないようにしています。ドキュメントでは、バッチ タイプ EXISTS を使用する場合、distinct キーワードは使用されないことが示唆されていますが、私の経験では、多対 1 の関係を取得する場合は常に使用されます。たとえば、Oracle の 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)) 

EXISTS バッチ タイプを使用して、バッチ クエリで個別のキーワードを使用しないようにする以外に、何か追加する必要があることはありますか?

4

1 に答える 1

1

バグを記録してください。これは、JOIN バッチ処理にのみ使用する必要があります。

それを避けるために、クエリでdistinctをfalseに設定できます。(ヒントはありません。ルート ObjectLevelReadQuery で dontUseDistinct() を呼び出す必要があります)。

((ObjectLevelReadQuery)((JpaQuery)query).getDatabaseQuery()).dontUseDistinct();
于 2012-12-17T15:18:20.677 に答える