2016-06-13 42 views
1

當我使用hibernate創建計數查詢時 - Criteria-將實體類中所有可能的表格添加爲左連接,這是不良的性能。Criteria當它只需要它的一部分時,添加實體類中的所有表格

實體:

@Entity 
@Table(name = "employees") 
Public Class Employees { 

    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "lz_job_stat_id") 
    private Integer id; 

    @ManyToOne 
    @JoinColumn(name = "departments_id") 
    private Departments departments; 


    @ManyToOne 
    @JoinColumn(name = "managers_id") 
    private Managers managers; 

} 

而且標準:

public class EmployeeDao { 

    public List<EmpDao> findIt(){ 
     ..... 
     Criteria crit = createEntityCriteria().setFetchMode("departments", FetchMode.SELECT); 
     crit.add(Restrictions.eq("managers.deleted", false)); 

     crit.setProjection(Projections.count("id")); 
     return crit.list(); 
    } 
} 

和產生的SQL:

select count() as y0_ 
from employees this_ 
left outer join departments department3_ 
    on this_.department_id=department3_.department_id 
left outer join managers manager2_ 
    on this_.manager_id=manager2_.manager_id 
現在

當我嘗試crit.list - 它創建一個左加入所有可能的表格。

當它不應該爲它們創建聯接時。標準明智足以知道我不需要這張桌子?只有我使用"WHERE CLAUSE" 有沒有一種方法可以明確告訴Criteria 「不要加入這個表格!!!」 沒有SQL

+0

休眠: /*條件查詢* /選擇 COUNT(*) as y0_ from employees This_ left outer join departments在this_.department_id = department3_.department_id department3_ LEFT OUTER JOIN \t經理manager2_上this_.manager_id = manager2_.manager_id – 2Big2BeSmall

+0

我們爲什麼不看到manager.deleted =假的限制?你確定它是由這個標準生成的查詢嗎? – Thierry

+0

它在複製粘貼上錯過了。在這種情況下 – 2Big2BeSmall

回答

1

指定上ManyToOne註釋獲取類型:

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "departments_id") 
private Departments departments; 
在標準

或IMHO更優選:

criteria.setFetchMode("departments", FetchMode.SELECT) 
+1

,應該在部門,而不是管理者使用,因爲對管理者的限制,但不是在部門,這是意想不到的外部聯接@Francy越來越。 – Thierry

+0

@Thierry好點。我會考慮的。 –

+0

我已經嘗試過.setFetchMode,並且我一直在爲其他實體獲取左外連接。 – 2Big2BeSmall

相關問題