在 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_PAR
T
和
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 章 - 实体关系中,您将深入了解关联和双向
我正在尝试初始化一个名为 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_PAR
T
和
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 章 - 实体关系中,您将深入了解关联和双向