在 JPQL 中使用 new 运算符来初始化构造函数

Using the new operator in JPQL to initialize a constructor

我正在尝试初始化一个名为 ShopOrder 的 class,它看起来像:

public ShopOrder(int po_id, long po_number, Date po_due_date,
            long po_part_id, int part_quantity, int part_id, int part_number,
            String part_decription, long plasma_hrs, long gring_hours,
            long mill_hrs, long breakpress_hrs) {

通过执行以下操作:

@Query("SELECT new ShopOrder(po.id, po.po_number, "
            + "po.due_date, po_part.id, po_part.part_quantity, "
            + "part.id, part.part_number, part.part_description "
            + "part.plasma_hrs_per_part, part.grind_hrs_per_part, "
            + "part.mill_hrs_per_part, part.brakepress_hrs_per_part) "
            + "FROM Po po LEFT JOIN po.partList po_part "
            + "LEFT JOIN po_part.part")
    List<ShopOrder> getShopOrder();

它从位于此代码段底部的名为 partList 的列表中获取其值:

@Entity
@Table(name = "T_PO")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Po implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

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

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

    @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentLocalDate")
    @JsonSerialize(using = CustomLocalDateSerializer.class)
    @JsonDeserialize(using = ISO8601LocalDateDeserializer.class)
    @Column(name = "due_date")
    private LocalDate due_date;

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

    @Column(name = "total_sale", precision=10, scale=2)
    private BigDecimal total_sale;

    @ManyToOne
    @JoinColumn(name = "customer_id", referencedColumnName = "id")
    private Customer customer;

    @OneToMany
    private List<Po_part> partList;

但是我遇到了一些让我有点困惑的错误。它说我失踪了:

Caused by: org.hibernate.HibernateException: Missing table: T_PO_T_PO_PART

Caused by: org.springframework.beans.factory.BeanCreationException: Error 
creating bean with name '(inner bean)#3e5970de': Cannot resolve reference to 
bean 'entityManagerFactory' while setting constructor argument; nested 
exception is org.springframework.beans.factory.BeanCreationException: Error 
creating bean with name 'entityManagerFactory' defined in class path 
resource: Invocation of init method failed; nested exception is   
org.hibernate.HibernateException: Missing table: T_PO_T_PO_PART

任何建议将不胜感激。

我有一个 Po_Part table,你可以看出它是 Po 和 Part 的连接 table。 Po 和 Part 之间存在 ManyToMany 关系,所以我一直在摸不着头脑。

---------更新---------

这是我现在尝试做的,但现在仍然有效:

@Entity
@Table(name = "T_PO_PART")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Po_part implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "part_quantity")
    private Integer part_quantity;

    @ManyToOne
    private Part part;

    @ManyToOne
    private Po po;

    @OneToMany
    List<Po> poList;

    @OneToMany
    List<Part>partList;

@Entity
@Table(name = "T_PO")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Po implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

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

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

    @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentLocalDate")
    @JsonSerialize(using = CustomLocalDateSerializer.class)
    @JsonDeserialize(using = ISO8601LocalDateDeserializer.class)
    @Column(name = "due_date")
    private LocalDate due_date;

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

    @Column(name = "total_sale", precision=10, scale=2)
    private BigDecimal total_sale;

    @ManyToOne
    @JoinColumn(name = "customer_id", referencedColumnName = "id")
    private Customer customer;

    @OneToMany
    private List<Po_part> partList;

部分

@Entity
@Table(name = "T_PART")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Part implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

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

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

    @Column(name = "plasma_hrs_per_part", precision=12, scale=4)
    private BigDecimal plasma_hrs_per_part;

    @Column(name = "laser_hrs_per_part", precision=12, scale=4)
    private BigDecimal laser_hrs_per_part;

    @Column(name = "grind_hrs_per_part", precision=12, scale=4)
    private BigDecimal grind_hrs_per_part;

    @Column(name = "mill_hrs_per_part", precision=12, scale=4)
    private BigDecimal mill_hrs_per_part;

    @Column(name = "brakepress_hrs_per_part", precision=12, scale=4)
    private BigDecimal brakepress_hrs_per_part;

    @Column(name = "lb_per_part", precision=12, scale=4)
    private BigDecimal lb_per_part;

    @Column(name = "inventory_count")
    private Integer inventory_count;

    @ManyToMany
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    @JoinTable(name = "T_PART_MATERIAL",
               joinColumns = @JoinColumn(name="parts_id", referencedColumnName="ID"),
               inverseJoinColumns = @JoinColumn(name="materials_id", referencedColumnName="ID"))
    private Set<Material> materials = new HashSet<>();

    @OneToMany
    private List<Po_part> partList;

但是现在我收到以下错误:

Caused by: org.springframework.beans.factory.BeanCreationException: Error 
creating bean with name '(inner bean)#6216f0e8': Cannot resolve reference to 
bean 'entityManagerFactory' while setting constructor argument; nested 
exception is org.springframework.beans.factory.BeanCreationException: Error 
creating bean with name 'entityManagerFactory' defined in class path 
resource: Missing table: T_PART_T_PO_PART

因为 Po_part 是连接 table 但我需要来自 Po 和 Part 的信息来初始化 Shop_order class 如:

@Query("SELECT new ShopOrder(po.id, po.po_number, "
            + "po.due_date, po_part.id, po_part.part_quantity, "
            + "part.id, part.part_number, part.part_description "
            + "part.plasma_hrs_per_part, part.grind_hrs_per_part, "
            + "part.mill_hrs_per_part, part.brakepress_hrs_per_part) "
            + "FROM Po po LEFT JOIN po.partList po_part "
            + "LEFT JOIN po_part.part")
    List<ShopOrder> getShopOrder(); 

我有点困惑我应该怎么做。我仍然对 JPA 和 JavaEE 着迷。把这些放在一起就是我遇到的问题。

我也试过这样映射:

@OneToMany
    @JoinTable(name = "T_PO_PART",
    joinColumns = @JoinColumn(name="poId", referencedColumnName="po_id"),
    inverseJoinColumns = @JoinColumn(name="partId", referencedColumnName = "part_id"))
    List<Po> poList;

    @OneToMany
    @JoinTable(name = "T_PO_PART",
    joinColumns = @JoinColumn(name="partId", referencedColumnName="part_id"),
    inverseJoinColumns = @JoinColumn(name="poId", referencedColumnName = "po_id"))
    List<Part>partList; 

但是我得到了以下错误:

Caused by: org.hibernate.MappingException: Unable to find column with 
logical name: part_id in org.hibernate.mapping.Table(T_PO) and its related 
supertables and secondary tables

我希望这个 post 对遇到这个 post 的任何人都非常有用...

上次更新说明了很多。暂时忘掉数据库。根据实体 Po、Part 和 Po_part 的代码,您有以下不同的关联,其中 * 和 1 是关联的 origin/destination:

的重数

Po (1)-------{partList}---->(*) Po_part

Po_part (1)--{poList}------>(*) Po

Po_part (*)--{po}---------->(1) Po

Po_part (1)--{part}-------->(*) Part

Po_part (*)--{partList}---->(1) Part

Part (1)-----{partList}---->(*) Po_part

因此它们之间共有 6 种不同的关联。 这是你真正想要的吗?

根据您的数据库模型,我认为您正在尝试在实体之间进行 双向 关联,如下所示:

Po_part (1)<------>(*) Po

Po_part (1)<------>(*) Part

还有这一种实现方式(注意mappedBy属性):

部分

@Entity
@Table(name = "T_PART")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Part implements Serializable {
...
@OneToMany(mappedBy="part")
private List<Po_part> partList;

@Entity
@Table(name = "T_PO")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Po implements Serializable {
...
@OneToMany(mappedBy="po")
private List<Po_part> partList;

Po_part

@Entity
@Table(name = "T_PO_PART")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Po_part implements Serializable {
...
@ManyToOne
private Part part;

@ManyToOne
private Po po;

//-- DELETE the this associations --//
//@OneToMany
//List<Po> poList;
//@OneToMany
//List<Part>partList;

然后,如果您想将此关联映射到特定的列名称或映射到第三个 table,则必须将 @JoinColumn/@JoinTable 注释放在 po 上and/or part 仅 _Po_part_ 实体的属性(不要将此放在 mappedBy 属性 内的注释中)。

我建议你阅读本书的第 4 章 Beginning Java EE 7 (Apress) 以了解 Java 持久性的基础知识 API.接下来,在第 5 章 - 实体关系中,您将深入了解关联和双向