JPQL возвращает все связанные сущности - PullRequest
3 голосов
/ 10 февраля 2020

Я пытаюсь получить массив Order [], который включает все заказы, в которых соответствующий документ не получен.

Я попытался выполнить этот запрос, и он возвращает правильное количество строк.

 @Query("Select o FROM Order o INNER JOIN o.properties p  INNER JOIN p.documents  d WHERE d.received = false")
    Order[] findUnreceivedOrders();

Проблема состоит в том, что объекты заказа в моем массиве включают ВСЕ документы не только не полученные, но я хочу, чтобы объект включал только непринятые объекты документа.

Кто-нибудь знает, как Чтобы решить эту проблему?

Спасибо за помощь!

Заказ. java

@Entity
@Table(name = "orders")
@JsonIgnoreProperties(ignoreUnknown = true,
        value = {"progress"})
public class Order {

    @Id
    @Column(name = "id", unique = true)
    private String orderid;
    @Column(name = "user_id")
    private String userid;
    @Column(name = "entrydate")
    private java.sql.Date entrydate;
    @Column(name = "info")
    private String info;
    @Column
    private boolean complete;
    @Column(name= "cached")
    private boolean cached;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "order")
    private List<Property> properties = new ArrayList<>();

    @OneToOne(mappedBy = "order", cascade =  CascadeType.ALL)
    private BillingAdress billingAdress;

    // Getter & Setter

Property. java

@Entity
@Table(name = "properties")
@JsonIgnoreProperties(ignoreUnknown = true,
        value = {"progress"})
public class Property
{
    @Id
    @Column(name = "propertyid", unique = true )
    private String id;
    @Column(name = "name")
    private String name;
    @Column(name = "street")
    private String street;
    @Column(name = "zip")
    private String zip;
    @Column(name = "town")
    private String town;
    @Column
    private String house_number;


    @OneToMany(cascade = CascadeType.ALL, mappedBy = "property")
    private List<Landregisterfolio> landregisterfolios = new ArrayList<>();

    @Column(name = "userid" )
    private String userid;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "property")
    private List<Document> documents = new ArrayList<>();

    @ManyToOne
    @JoinColumn(name = "order_id")
    @JsonIgnore
    private Order order;

    @Column(name = "order_id", insertable = false, updatable = false)
    private String orderid;

//Getter & Setter
}

Документ. java


@Entity
@Table(name = "documents")
public class Document {

    @Id
    @Column(name="id")
    private String docid;
    @Column(name="name")
    private String docname;
    @Column(name = "received")
    private Boolean received;
    @Column(name = "requested")
    private Boolean requested;
    @Column(name ="last_contact")
    private Date lastContact;
    @Column(name ="intern_comment")
    private String intern_comment;
    @Column(name ="extern_comment")
    private String extern_comment;
    @Column(name="fees")
    private double fees;

    @ManyToOne
    @JoinColumn(name = "property_propertyid")
    @JsonIgnore
    private Property property;

    @Column(name = "property_propertyid", insertable = false, updatable = false)
    private String propertyid;

//Getter & Setter

}

Ответы [ 3 ]

3 голосов
/ 10 февраля 2020

Возможно, вы можете сопоставить @ManyToOne Order с вашей Document сущностью и после использования для Order сущности

@JoinColumnOrFormula(formula = @JoinFormula("(select d.id from documents d WHERE d.order_id = id AND d.received = false"))
List<Document> unreceivedDocuments;
0 голосов
/ 11 февраля 2020

Благодаря @pdem!

Использовал "join fetch", изменил мои списки на наборы, и он отлично работает.

0 голосов
/ 10 февраля 2020

U имеет список Property в Order и список Document в Property. Так что если у вас есть один Document со статусом, не полученным в вашем списке, у вас будет этот Order.

...