Java 从与JPA中的联接表的多个关系中获取结果集

Java 从与JPA中的联接表的多个关系中获取结果集,java,mysql,hibernate,jpa,Java,Mysql,Hibernate,Jpa,我有一个比较复杂的查询,我正试图找出如何将结果存储在模型中。例如: public interface Po_partRepository extends JpaRepository<Po_part, Long> { @Query(value = "SELECT * FROM T_PO_PART u WHERE u.po_id LIKE %?1", nativeQuery = true) List<Po_part> findByPoId(Long p

我有一个比较复杂的查询,我正试图找出如何将结果存储在模型中。例如:

public interface Po_partRepository extends JpaRepository<Po_part, Long> {

    @Query(value = "SELECT * FROM T_PO_PART u WHERE u.po_id LIKE %?1", 
  nativeQuery = true)
    List<Po_part> findByPoId(Long poId);

    @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.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();
这里还有这个查询所来自的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;

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

查询在mySQL工作台中工作,而不是在JPA中工作。我知道JPA的语法有点不同,但我认为nativeQuery支持纯SQL语法

至于ResultSet问题,我不确定是否有任何mappedBy声明,因为我使用了@JoinTable

我很清楚我的两个问题是: 1) 从我上面的查询中,我如何设置我的模型?
2) nativeQuery真的允许纯SQL语法吗?

因为您的
po_part
表不仅仅是一个简单的联接表(订单中的每个部分都有一个数量),所以您需要将该联接表映射到一个单独的实体(比如称为
po_part
)。该实体将与
Po
Part
关联,以及该订单上零件数量的字段

然后您的
Po
实体将拥有订单内零件的集合,假设
Po\u零件
有一个
Po
引用返回订单:

@OneToMany(mappedBy = "po")
private List<Po_Part> partList;
@OneToMany(mappedBy=“po”)
私有列表部分列表;
有关查询的详细信息,请参见my。

这是以前提出的问题,有一些答案,特别是在使用JPA 2.1时。是JPA允许SQL:如果显示的第一个查询正常,请尝试删除getShopOrders查询中的分号
Exception in com.htd.web.rest.Po_partResource.getAll() with cause = 
org.hibernate.exception.SQLGrammarException: could not extract ResultSet
org.springframework.dao.InvalidDataAccessResourceUsageException: could not    
extract ResultSet; SQL [n/a]; nested exception is 
org.hibernate.exception.SQLGrammarException: could not extract ResultSet
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You 
have an error in your SQL syntax; check the manual that corresponds to your 
MySQL server version for the right syntax to use near 'hillcresttooldie.t_po 
po join hillcresttooldie.t_po_part po_part on po_part.po_i' at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)   
~[na:1.8.0_31]
@OneToMany(mappedBy = "po")
private List<Po_Part> partList;