2016-07-11 48 views
0

Ich arbeite mit Hibernate und DTO, DAO Design Patterns (Java).Wie alle SubcriteriaList aus projectionCriteria in Hibernate (Java) zu entfernen - zu verhindern, Links Join

Ich habe eine Entity-Klasse und ein Attribut darin und sie sind mit @ManyToOne Annotation definiert.

Ich möchte eine Zählung Abfrage erstellen und "tell" Ruhezustand "DO NOT JOIN" mit @ManyToOne Tabellen

Während eine Zählung Abfrage erstellen:

(Long) crit.setProjection(Projections.count("id")).uniqueResult(); 

Die SQL exceute von Hibernate ist mit left join drin .

Auch wenn ich explizit auf der @Id Annotation von der Entitätsklasse zählen. Die tatsächliche Abfrage erscheint mit LEFT JOIN für alle anderen Tabellen.

Diese von Hibernate erstellte SQL-Abfrage ist nicht effizient, da es keinen Grund gibt, eine linke Verknüpfung zu erstellen, wenn @ManyToOne festgelegt ist.

Nach dem Versuch, und das Lesen über Hibernate fand ich etwa aus FetchMode aber selbst wenn FetchMode.LAZY

.setFetchMode("brand", FetchMode.LAZY) 

Die Sql von hiberante Einstellung nach links in ihm beitreten zu haben.

Ich habe auch das Foto von debug angefügt, das alle SubcriteriaList zeigt, die unter projektionCriteria ist.

Wie kann ich Hibernate DO NOT linken Join-Tabellen von Entity-Klasse? (ohne SQL-Abfrage selbst zu schreiben)?

This is where

public Response findAll() { 
    Criteria crit = getDtoCriteria(); 
} 

public Criteria getDtoCriteria() { 
    return getDtoCriteria(getDtoClass(), getSession()); 
} 

public Criteria getDtoCriteria(Class clazz, Session session) { 

    Criteria crit = createEntityCriteria(session); 
    setProjecttionForDto(crit, true, clazz); 
    return crit; 
} 

Das alles sind meine Teilkriterien

[Subcriteria(bran*******ance:bran*******ance), Subcriteria(buc*****:buc*****), Subcriteria(br****:br****), Subcriteria(dyn***:dyn***), Subcriteria(dyna*****.user:user)] 
+0

nur einen Gedanken: jede Chance auf ein anderes Unternehmen ohne manytoone Schaffung beitreten? – Apostolos

+0

Ich arbeite mit einem Build in "@Service, @Controller etc ..." mit 2 Entity wird nichts Gutes tun. i haben das gleiche Problem für mehr als eine Entität – 2Big2BeSmall

Antwort

1

Versuchen Sie es mit FetchMode.SELECT statt:

(Long) crit.setFetchMode("brand",FetchMode.SELECT) 
      .setProjection(Projections.count("id")) 
      .uniqueResult(); 
+0

habe ich versucht, dass: (Long) crit.setFetchMode ("br ***", FetchMode.SELECT) .setFetchMode ("bra ******** **** nces ", FetchMode.SELECT) .setFetchMode (" buc ******** Anzeigen ", FetchMode.SELECT) .setFetchMode (" lz ****** bs ", FetchMode.SELECT). setFetchMode ("Benutzer", FetchMode.SELECT) \t \t \t \t .setProjection (Projections.count ("id")). uniqueResult(); Und die Sql aus Winterschlaf weiter auf der linken äußeren Join erstellen. irgendeine andere Idee? – 2Big2BeSmall

+0

naja, das ist nervig ... ist es einfach, sich an einen Tisch zu setzen oder verbindet er sich mit allen 5 anderen Tischen? –

+0

Alle fünf Tabelle, wird das helfen? .createCriteria ("d *****", JoinType.NONE) – 2Big2BeSmall