Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 使用JPQL中的新运算符初始化构造函数_Hibernate_Jpa_Jpql - Fatal编程技术网

Hibernate 使用JPQL中的新运算符初始化构造函数

Hibernate 使用JPQL中的新运算符初始化构造函数,hibernate,jpa,jpql,Hibernate,Jpa,Jpql,我正在尝试初始化一个名为ShopOrder的类,该类如下所示: 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,

我正在尝试初始化一个名为ShopOrder的类,该类如下所示:

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();
如有任何建议,将不胜感激

我有一个Po_零件表,可以看出它是Po和零件的联接表。Po和Part有很多关系,所以我对这个问题摸不着头脑

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

这就是我现在试图做的,但它现在仍然在工作:

@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;

因为Po_part是联接表,但我需要来自Po和part的信息来初始化Shop_order类,如:

@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(); 

我希望这篇文章对任何看到这篇文章的人都非常有用。

上一次更新澄清了很多。暂时忘掉数据库吧。根据实体Po、零件和Po_零件的代码,您有以下不同的关联,其中*和1是关联的来源/目的地的多重性:

Po(1)——{partList}-->(*)Po\u零件

Po第(1)部分--{poList}-->(*)Po

Po\u部分(*){Po}-->(1)Po

pou部分(1){part}-->(*)部分

Po_零件(*){partList}-->(1)零件

第(1)部分----{partList}-->(*)Po_部分

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

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

@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; 
采购订单第(1)部分(*)采购订单

Po_第(1)部分(*)部分

这是实现它的一种方法(注意属性):

部分

@实体
@表(name=“T_零件”)
@缓存(用法=缓存并发策略。非严格读写)
公共类部件实现可序列化{
...
@OneToMany(mappedBy=“part”)
私有列表部分列表;
Po

@实体
@表(name=“T_PO”)
@缓存(用法=缓存并发策略。非严格读写)
公共类Po实现可序列化{
...
@OneToMany(mappedBy=“po”)
私有列表部分列表;
波乌部

@实体
@表(name=“T\U PO\U零件”)
@缓存(用法=缓存并发策略。非严格读写)
公共类Po_部件实现可序列化{
...
@许多酮
私人部分;
@许多酮
私人宝宝,;
//--删除此关联的名称--//
//@独身癖
//列表poList;
//@独身癖
//列表部分列表;
然后,如果要将此关联与特定列名或第三个表映射,则必须将/annotation置于_po_part_实体的po和/或part属性之上(不要将其置于
mappedBy
属性内的批注上)


我建议您阅读《从Java EE 7开始》(Apress)一书的第4章,了解Java持久化API的基础知识。接下来,在第5章-实体关系中,您将深入了解关联和双向

您有实体Po(表T_Po)、部分(T_Part)和部分(T_Po_Part),对吗?因此,默认情况下,关联是多对多的Po和Po_零件之间的(或定义为joinTable的一对多)映射到表T_Po_T_Po_零件(缺少)“@GuillermoFernández在T_PO_T_PO_零件表中显然不见了,它是否应该持有T_PO和T_PO_零件的外键?”GuillermoFernández在那里,没有创建另一张表?@GuillermoFernández换句话说,我在想办法在PO中创建一个“OneToMany”和一个“OneToMany”建议?您可以使用强制将一对多关联映射到第三个表(而不是joinColumn)上,并在多对多/一对多关联中指定第三个表的名称(有关示例,请参阅JoinTable和)。非常感谢。我现在正在读这本书,我正在读第7章。看起来我需要回去复习。我的查询有错误,但希望我能解决。希望我不会再花一周的时间:(
@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
@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(); 
@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
@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;
@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;