1
使用Eclipselink 2.4.1,我试图避免在批量查询中出现“distinct”关键字。文档建议,当使用批量类型EXISTS时,不使用distinct关键字,但根据我的经验,它在所有情况下都用于检索多对一关系。例如,我有以下的类在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间歇式,以避免批量查询使用distinct关键字?
请问您使用DISTINCT关键字时需要注意什么? – northpole
这在查询中是没有必要的,而且它对我感兴趣的情况(它比这个例子有更多的表)造成了一个糟糕的查询计划。 – cogitos