2015-08-05 25 views
5

Chcę pobrać dane z bazy modelA na użytkownika, które są w modelu B. Ale nie jest to obowiązkowe, że dla każdego rekordu będę miał rekord w modelu B. Więc kiedy używam poniższego kodu do pobierania danych, zwracam 0 rekordów.QueryDSL dodać sprzężenie krzyżowe podczas budowania zapytań zapytań

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

modelA.findAll(searchCriteria, pageable); 

Po debugowaniu stwierdziłem, że QueryDsl wstawił Cross join. Czy ktoś może mi powiedzieć, jak to naprawić, czy istnieje sposób, aby querydsl dodać lewe dołączenie zamiast łączenia krzyżowego? poniżej są moje dwa modele.

@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

jak udało Ci się go naprawić? –

Odpowiedz

0

Jeśli potrzebujesz lewy zamiast dołączyć trzeba będzie użyć wyraźne dołącza:

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

Ale problem polega na tym, że nie można tego użyć w metodzie findAll. –

+0

Predykat jest tylko warunkiem filtrowania, którego nie można wyrazić. –

+1

jak udało ci się to naprawić? –