2017-09-09 6 views
0

Ich würde diese Abfrage in HQL gerne schreiben:Hibernate mehrere Unterabfragen mit DetachedCriteria

select DISTINCT * from transportation transp 
    inner join price p on p.transportationId = transp.transportationId 
    where p.sectionId = (select sec.sectionId from section sec where sec.lineId = (select l.lineId from line l where l.lineId = 1000000000)) 

Aber weiß nicht, Subqueries schreiben. Ich weiß, dass ich DetachedCriteria verwenden muss.

Eine andere Frage: Wenn wir diese Abfrage in nativen Abfrage (mit createSQLQuery) schreiben können, wie objet zu Transporteinheit zurück abgeben kann?

Dank

Meine Einheiten:

@Entity 
@Table(name = "transportation") 
public class Transportation implements Serializable { 

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

    @OneToMany(mappedBy = "transportation", fetch = FetchType.EAGER) 
    @JsonBackReference(value = "price-transportation") 
    private Set<Price> prices = new HashSet<Price>(); 
    ... 
} 

@Entity 
@Table(name = "price") 
public class Price implements Serializable { 

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

    @ManyToOne(optional = false) 
    @JoinColumn(name = "transportationId") 
    @JsonManagedReference(value = "price-transportation") 
    private Transportation transportation; 
    ... 
} 

@Entity 
@Table(name = "section") 
public class Section implements Serializable { 

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

    @ManyToOne(optional = false) 
    @JoinColumn(name = "lineId") 
    @JsonManagedReference 
    private Line line; 
    ... 
} 


@Entity 
@Table(name = "line") 
public class Line implements Serializable { 

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

    @OneToMany(mappedBy = "line", cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    @JsonBackReference 
    private Set<Section> sections = new HashSet<Section>(); 
    ... 
} 

Antwort

0

ich mein Problem gelöst durch die Verwendung .addEntity (Transportation.class) wie folgt aus:

String query = "select DISTINCT * from moyen_transport transp" 
       + " join prix_voyage p on p.ID_MoyenTransport = transp.ID_MoyenTransport" 
       + " where p.ID_Troncon = (select t.ID_Troncon from troncon t where t.ID_Troncon = (select l.ID_Ligne from ligne l where l.ID_Ligne = 1000000000))"; 
Query result = getSession().createSQLQuery(query).addEntity(Transportation.class)**; 
List<Transportation> results = result.list(); 
Verwandte Themen