Java 如何在JPA中初始化模型
我只是尝试通过JPA查询初始化列表中的一个对象。到目前为止,我的一天半旅程都没有成功Java 如何在JPA中初始化模型,java,jpa,Java,Jpa,我只是尝试通过JPA查询初始化列表中的一个对象。到目前为止,我的一天半旅程都没有成功 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_
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 shopOrders;
int poNumber = shopOrders.getPo_number();
但是,当我运行查询时,我不断得到以下错误
[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的片段,以防有人想查看它们
/**
* 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
/**
* 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\u orders
实体对应的数据,那么您的查询应该是:
@Query("SELECT so FROM Shop_Orders so")
因为您已经将Shop\u Orders
实体映射到该表
但是,由于您似乎正在为涉及的3个表(PO,Part和两者之间的联接表,PO_Part)构建一个非规范化模型,那么您可能需要为原始查询创建一个非规范化数据库视图,然后通过在@表
注释中指定视图,将该视图映射到您的商店订单
实体
或者,您可以为Shop_Orders
(不需要是JPA实体)创建一个构造函数,该构造函数接受所有列。换言之:
public Shop_Orders(int po_id, int po_number, Date po_due_date, etc... )
然后,假设在Po
和Part
之间的联接表中有一个实体Po\u Part
(请参阅),查询可以是:
@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
有一个名为partList
的Po\u Part
集合
您很可能需要完全打包Shop\u Orders
类的路径
顺便说一下,我建议您不要使用复数来命名JPA实体类。换句话说,您的实体类应该称为
Shop\u Order
(或者可能称为Shop\u Order
),因为该类的每个实例只表示一个车间订单。Shop\u订单应该符合JavaBean合同,以便您可以将其作为一个实体。缺点是什么?作为一个实体,您可以从PersistenceContext获取EntityManager(如果bean是应用程序管理的),并按照您的意愿加载bean。如果bean是容器管理的,那么您可以通过依赖项注入获得EntityManager?我刚刚更改了Shop_Orders类,使其符合JavaBean契约。但是,我没有添加任何注释。我仍在努力将这一切联系在一起。我刚刚创建了一个名为SHOP_ORDERS的表,添加了“@”实体注释“@”列等,并尝试再次运行查询,但仍然得到错误消息:cannot cast to com.htd.repository.SHOP_ORDERS属性通常直接对应于数据库表,但不一定。一个实体也可以表示对应于多个表的数据模型的非规范化表示。@scottb更新了注释,希望我能更清楚地说明我的问题所在。
@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");