2015-07-11 92 views
4

我试图从采购订单(Po)的id中获取材料。路径和连接表中有几个集合。从具有复杂JPA查询的集合中获取值

Po.java

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

    @ManyToOne 
    @JoinColumn(name = "customer_id", referencedColumnName = "id") 
    private Customer customer; 

    @OneToMany(mappedBy = "po", targetEntity = Po_part.class) 
    private List<Po_part> partList; 

Part.java

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

    @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(mappedBy="part",targetEntity=Po_part.class) 
    private List<Po_part> partList; 

Po_part.java

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

Material.java

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

    @ManyToOne 
    @JoinColumn(name = "supplier_id", referencedColumnName = "id") 
    private Supplier supplier; 

    @ManyToOne 
    @JoinColumn(name = "supplier_id_2", referencedColumnName = "id") 
    private Supplier supplier2; 

JPA查询在MaterialRespository

@Query("SELECT m FROM Material m " 
      + "JOIN Po po " 
      + "JOIN po.partList po_part " 
      + "JOIN po_part.part parts " 
      + "JOIN parts.materials materials " 
      + "WHERE po.id = ?1") 
    List<Material> getListOfMaterialsForPo(Long id); 

最终的结果是我希望能够得到一个宝

-------更新所需的材料清单------ ---

我得到了下面的查询,以便对MySQL工作台工作,但只有当我真正需要的实际材料对象来访问它的getter返回库存。不确定这是否可以用SQL解决。

查询:

@Query(value="SELECT materials.inventory_count materials " 
        +"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 " 
        +"join hillcresttooldie.T_PART_MATERIAL material " 
        +"on material.materials_id = part.id " 
        +"join hillcresttooldie.T_MATERIAL materials " 
        +"on material.materials_id = materials.id " 
        +"where po.id LIKE %?1", nativeQuery = true) 
     List<Integer> getListOfMaterialsForPo(Long id); 

而且真的有我不知道的另一件事情是有MySQL的工作类型替补JPA。在Eclipse中我有下面附加:

enter image description here

enter image description here

不过,我从来没有使用过。认为将此添加到帖子会有所帮助。

回答

1

需要一些时间来真正学习JPQL。这并不难。 JPQL使用关联进行连接。查询你需要IAS那样简单

select material from Po po 
join po.partList popart 
join popart.part part 
join part.materials material 
where po.id = :poId 

并请,到类给meaninful名称和尊重的Java命名约定。

+0

你也指什么类?感谢您的帮助,我在JPA非常新,并且纠正它并不那么困难,但我仍然掌握着它。我自学自己。我确实通过创建一个类来实现它,并使用JPA中的NEW运算符用我需要的值初始化类。但是,您的解决方案更简单,我感谢你。 – Drew1208

+0

Java类名不包含下划线。你的。在开始这个项目之前想象你自己,在StackOverflow上帮助我,在那里我向你展示一个名为'Po'的类。你会不知道这样的班级代表什么?现在想象我给你看一个名为PuchaseOrder的课程?现在没有那么清楚了吗? –

+0

是的,我明白了,再次感谢。 – Drew1208