2015-08-05 9 views
5

Desidero recuperare i dati dal modelloA base dell'utente che sono in modelB. Ma non è obbligatorio che per ogni record avrò un record nel modelloB. Quindi quando uso il codice sottostante per recuperare i dati, restituisce 0 record.QueryDSL aggiunge cross join durante la creazione di query di stima

BooleanExpression searchCriteria = searchCriteria 
      .and(
        qModelA.modelb.user.id.eq(userId) 
      ) 
      .and (some other conditions as well); 

modelA.findAll(searchCriteria, pageable); 

Quando eseguo il debug, ho rilevato che QueryDsl inserisce Cross join. Qualcuno può dirmi come risolvere il problema, esiste un modo in cui querydsl aggiunge un join a sinistra invece del cross join? di seguito sono i miei due modelli.

@Entity 
public class ModelA implements Serializable { 

    private Long id; 
    private String label; 
    private ModelB modelB; 

    @Id 
    @SequenceGenerator(name = "modelASeq", sequenceName = "modela_id_seq", allocationSize = 1) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "modelASeq") 
    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @Column(length = 150, nullable = false) 
    public String getLabel() { 
     return label; 
    } 

    public void setLabel(String label) { 
     this.label = label; 
    } 

    @OneToOne(mappedBy = "modelA", cascade = CascadeType.REMOVE) 
    public ModelB getModelB() { 
     return modelB; 
    } 

    public void setModelB(ModelB modelB) { 
     this.modelB = modelB; 
    } 

} 

@Entity 
public class ModelB implements Serializable { 

    private Long id; 
    private User user; 
    private ModelA modelA; 

    @Id 
    @SequenceGenerator(name = "modelBSeq", sequenceName = "modelb_id_seq", allocationSize = 1) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "modelBSeq") 
    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @NotNull 
    @ManyToOne 
    @JoinColumn(name = "user_id", nullable = false) 
    public User getUser() { 
     return user; 
    } 

    public void setUser(User user) { 
     this.user = user; 
    } 

    @NotNull 
    @OneToOne 
    @JoinColumn(name = "modela_id", nullable = false) 
    public ModelA getModelA() { 
     return modelA; 
    } 

    public void setModelA(ModelA modelA) { 
     this.modelA = modelA; 
    } 

} 
+1

come sei riuscito a risolvere il problema? –

risposta

0

Se hai bisogno di una sinistra unirsi invece sarà necessario utilizzare esplicito join:

query.from(modelA) 
    .leftJoin(modelA.modelB, modelB) 
    ... 
+0

Ma il problema è che questo non può essere usato con il metodo findAll. –

+0

Un predicato è solo una condizione di filtro in cui non è possibile esprimere altro. –

+1

come hai risolto? –

Problemi correlati