2016-06-13 4 views
1

wenn ich eine Zählungsabfrage mit Hibernate erstelle - Kriterien - füge alle möglichen Tabellen aus der Entitätsklasse als linker Join hinzu, was eine schlechte Leistung ist.Kriterien Fügen Sie alle Tabellen aus der Entitätsklasse hinzu, wenn sie nur einen Teil davon benötigt

Das Unternehmen:

@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; 

} 

Und die Kriterien:

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(); 
    } 
} 

Und das erzeugte 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 

jetzt, wenn ich versuche, die crit.list - es hat eine linke erstellen Join für alle möglichen Tabellen.

wenn es nicht ein Join für alle von ihnen erstellen soll. Istnt Kriterien Smart genug, um zu wissen, dass ich diese Tabellen nicht brauche? nur die, die ich benutze die "WHERE CLAUSE" gibt es eine Möglichkeit, explizit zu sagen, Kriterien "NICHT DIESE TABELLEN!" ohne SQL

+0

Ruhezustand: /* Kriterien Abfrage */wählen count (*) wie y0_ von Mitarbeiter this_ linken äußeren Join Abteilungen department3_ auf this_.department_id = department3_.department_id LEFT OUTER JOIN \t Manager manager2_ auf this_.manager_id = manager2_.manager_id – 2Big2BeSmall

+0

Warum gehen wir nicht die Beschränkung auf manager.deleted = false sehen? Sind Sie sicher, dass es sich um die Abfrage handelt, die von diesem Kriterium generiert wird? – Thierry

+0

Es wurde auf der Kopierpaste verpasst. – 2Big2BeSmall

Antwort

1

angeben Typ auf ManyToOne Annotation fetch:

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

oder IMHO mehr bevorzugt in Kriterien:

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

In diesem Fall sollte es eher für Abteilungen als für Manager verwendet werden, da es eine Beschränkung für Manager gibt, aber nicht für die Abteilung, was der unerwartete äußere Join @Francy ist. – Thierry

+0

@ Thierry guter Punkt. Ich werde darüber nachdenken. –

+0

Ich habe den .setFetchMode ausprobiert, und ich bekomme immer noch den linken äußeren Join für andere Entitäten. – 2Big2BeSmall

Verwandte Themen