【问题标题】:JPQL returns all associated EntitiesJPQL 返回所有关联的实体
【发布时间】:2023-04-06 08:39:01
【问题描述】:

我正在尝试获取 Order[] 数组,其中包含未收到相关文档的所有订单。

我尝试了这个查询,它返回了正确的行数。

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

问题是,我的数组中的订单对象不仅包括未收到的所有文档,而且我希望该对象仅包括未收到的文档对象。

有人知道怎么解决吗?

感谢您的帮助!

Order.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
}

Document.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

}

【问题讨论】:

  • 您使用的是什么 orm 实现:Hibernate、EclipseLink、另一个 ORM?
  • 使用is false 而不是= false
  • @pdem 我正在使用休眠
  • 尝试使用“join fetch”,它应该可以在休眠状态下工作。
  • @pdem 使用它并得到了 MultipleBagFetchException。将我的列表更改为集合,它工作正常。谢谢。

标签: java spring-data-jpa jpql


【解决方案1】:

您可能可以将@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;

【讨论】:

    【解决方案2】:

    你有Order 中的Property 列表和PropertyDocument 的列表。因此,如果您有一个Document,而您的列表中没有收到状态,您将拥有这个Order

    【讨论】:

    • 我知道,但我只想要列表中未收到的文档。所以订单对象应该只包含未收到的对象而不是全部。
    【解决方案3】:

    感谢@pdem!

    使用“join fetch”,将我的列表更改为集合,它工作正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-04
      • 2019-04-26
      • 2017-09-03
      • 2017-02-02
      • 1970-01-01
      • 2018-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多