如何在JPA中初始化模型 [英] How to initialize a model in JPA

查看:96
本文介绍了如何在JPA中初始化模型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我只是想通过JPA查询初始化列表内的对象.到目前为止,在我的1 1/2天的旅程中都没有成功.

I am simply trying to initialize an object inside a list via a JPA query. Been unsuccessful in my 1 1/2 day journey thus far.

public interface Po_partRepository extends JpaRepository<Po_part, Long> {
  @Query(value = "SELECT " + "po.id po_id," + "po.po_number po_number,"
    + "po.due_date po_due_date," + "po_part.id po_part_id,"
    + "po_part.part_quantity part_quantity," + "part.id part_id,"
     + "part.part_number part_number,"
    + "part.part_description part_description,"
    + "part.plasma_hrs_per_part plasma_hrs,"
    + "part.grind_hrs_per_part grind_hrs,"
    + "part.mill_hrs_per_part mill_hrs,"
    + "part.brakepress_hrs_per_part brakepress_hrs "
    + "FROM hillcresttooldie.t_po po "
    + "join hillcresttooldie.t_po_part po_part "
    + "on po_part.po_id = po.id " + "join hillcresttooldie.t_part part "
    + "on part.id = po_part.part_id;", nativeQuery = true)
List<Shop_Orders> getShopOrders(); }

Shop_Orders模型

Shop_Orders Model

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

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

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int shop_order_id;

@Column(name = "po_id")
private int po_id;

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

@Column(name = "po_date")
private Date po_due_date;

@Column(name = "part_quanity")
private int part_quanity;

@Column(name = "part_id")
private int part_id;

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

@Column(name = "plasma_hrs")
private int plasma_hrs;

@Column(name = "grind_hrs")
private int grind_hrs;

@Column(name = "mill_hrs")
private int mill_hrs;

@Column(name = "breakpress_hrs")
private int breakpress_hrs;

public Shop_Orders() {

}

public int getPo_id() {
    return po_id;
}

我为shop_orders创建了表格:

I created table for shop_orders:

这里是一个示例,该示例是查询运行并且对象在列表中设置后我想做的事情.

Here is an example of what I would like to do once query is ran and the object is set in the list.

Shop_Orders shopOrders;
int poNumber = shopOrders.getPo_number(); 

但是,当我运行查询时,我仍然收到以下错误消息

However I keep getting the following error when I run the query

[ERROR] com.htd.aop.logging.LoggingAspect - Exception in 
com.htd.web.rest.Po_partResource.getAll() with cause = null
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to 
com.htd.repository.Shop_Orders
at com.htd.web.rest.Po_partResource.getAll(Po_partResource.java:85) ~  
[classes/:na]

我将发布Po.java和Part.java的摘要,以防有人想要查看它们.

I will post snippets of Po.java and Part.java in case someone wants to look at them.

/**
* A Po.
*/
@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;

part.java

part.java

/**
 * A Part.
 */
@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;

感谢您的建议.

推荐答案

如果您有一个表,其中包含与Shop_orders实体相对应的数据,那么您的查询应该只是:

If you have a table which contains the data that corresponds to your Shop_orders Entity, then your query should just be:

@Query("SELECT so FROM Shop_Orders so")

由于您已将Shop_Orders实体映射到该表.

Since you have mapped the Shop_Orders Entity to that table.

但是,由于您似乎要针对所涉及的3个表(PO,Part和两个表之间的联接表PO_Part)构建非规范化模型,所以您可能需要为该表创建非规范化数据库VIEW.原始查询,然后通过在@Table批注中指定视图将视图映射到Shop_Orders实体.

However, since you seem to be constructing a de-normalised model of the 3 tables involved (PO, Part and the join table between the two, PO_Part), then perhaps you need to create a de-normalised database VIEW for the original query you had, and then map that view to your Shop_Orders entity by specifying the view in your @Table annotation.

或者,您可以为Shop_Orders(不需要是JPA实体)创建一个构造函数,该构造函数接受所有列.换句话说:

Alternatively, you could create a constructor for Shop_Orders (which doesn't need to be a JPA Entity) that takes all the columns. In other words:

public Shop_Orders(int po_id, int po_number, Date po_due_date, etc... )

,然后,假设您在PoPart之间的联接表中具有实体Po_Part(请参阅

and then, assuming that you have an Entity Po_Part for the join table between Po and Part (see my answer to your other question), the query can be:

@Query("SELECT new Shop_Orders(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");

这还假设Po具有称为partListPo_Part集合.

That's also assuming that Po has a collection of Po_Part called partList.

您很可能必须完全打包Shop_Orders类的路径.

You would most likely have to fully package-path the Shop_Orders class.

顺便说一句,我建议您不要使用复数形式命名JPA实体类.换句话说,您的Entity类应称为Shop_Order(或可能为ShopOrder),因为此类的每个实例仅表示一个车间订单.

By the way, I would recommend that you do not name your JPA Entity classes using plurals. In other words, your Entity class should be called Shop_Order (or possibly ShopOrder) as each instance of this class would only represent one Shop Order.

这篇关于如何在JPA中初始化模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆