2017-01-21 30 views
1

我正在开发一个Web应用程序JavaEE,我使用JPA命名查询来查询数据库。然而,我不知道如何做到这一点,当连接多个分支表,我试图建立并执行一些查询以下情况,但它总是返回null如何在JPA NamedQuery中与多个分支连接表

这里是介绍我的情况的图像: IMAGE

我在哪里尝试选择从多个表(实体)与多个字段联接使用@NamedQuery。请注意,我删除setter和getters从下面的类减少代码大小。

@MappedSuperclass 
@EntityListeners({Logger.class}) 
public abstract class SuperEntity implements Serializable,HasName{ 

    @Transient 
    private static final long serialVersionUID = -6420076371961889265L; 

    @Id 
    @SequenceGenerator(initialValue = 0, allocationSize = 1, name = "IdGenerator") 
    @GeneratedValue(strategy=GenerationType.SEQUENCE,generator = "IdGenerator") 
    private long ID; 

    @Version 
    private long version; 
} 




      @Entity 
      public class Party extends SuperEntity { 

       @Length(min = 1, max = 30, message = "Invalid party name.") 
       private String name; 

       @Enumerated(EnumType.STRING) 
       @NotNull 
       private PartyType type; 

       @Length(min = 1, max = 13, message = "Invalid phone number") 
       private String phone; 

       @Email(message = "Invalid email address.") 
       @NotNull 
       private String email; 

       @NotNull 
       @NotEmpty(message = "Party address is required.") 
       private String address; 

       @Valid 
       @OneToMany(cascade = CascadeType.ALL, mappedBy = "party", fetch = FetchType.EAGER) 
       private List<Vehicle> vehicles = new ArrayList<Vehicle>(); 

     } 

       @Entity 
      public class Vehicle extends SuperEntity { 

       @Valid 
       @Embedded 
       private VehicleAttributes attributes; 

       @ManyToOne(cascade={CascadeType.PERSIST,CascadeType.MERGE}) 
       @JoinColumn(name = "partyID") 
       private Party party; 

       @Valid 
       @OneToMany(cascade = CascadeType.ALL, mappedBy = "vehicle",fetch=FetchType.EAGER) 
       private List<FixRequest> fixRequests = new ArrayList<FixRequest>(); 
      } 


      @NamedQuery(name = FixRequest.GET_NOT_PAID_REQUESTS_BY_PARTY_QUERY, query = "Select new org.master.jpa.UnpaidFixRequestObject(v.attributes.type,v.attributes.model,fr.ID,fr.requestDate,SUM(f.cost),SUM(p.paidAmount)) From Vehicle v,FixRequest fr,Payment p,Fix f,FixJoin fj WHERE v=fr.vehicle AND fr=p.fixRequest AND fr=fj.fixRequest AND fj.fix=f AND v.party.ID=:partyID GROUP BY v.attributes.type,v.attributes.model,fr.ID,fr.requestDate") 
      @Entity 
      public class FixRequest extends SuperEntity implements Serializable { 

      @Transient 
      static final String GET_NOT_PAID_REQUESTS_BY_PARTY_QUERY = "getNotPaidRequestsByParty"; 
      @Transient 
      static final String GET_NOT_PAID_REQUESTS_BY_PARTY_QUERY_PARTY_PARAM = "partyID"; 
       @NotNull 
       @Temporal(TemporalType.TIMESTAMP) 
       private Date requestDate; 

       @NotNull 
       @Temporal(TemporalType.DATE) 
       private Date requestedFixDate; 

       @ManyToOne(cascade={CascadeType.PERSIST,CascadeType.MERGE}) 
       @JoinColumn(name = "vehicleID") 
       private Vehicle vehicle; 

       @OneToMany(cascade = CascadeType.ALL,fetch=FetchType.EAGER,mappedBy="fixRequest") 
       private List<TroubleJoin> request_Troubles = new ArrayList<TroubleJoin>(); 

       @OneToMany(cascade = CascadeType.ALL,fetch=FetchType.EAGER,mappedBy="fixRequest") 
       private List<FixJoin> requset_Fixes = new ArrayList<FixJoin>(); 

       @OneToMany(cascade = CascadeType.ALL,fetch=FetchType.EAGER,mappedBy="fixRequest") 
       private List<Payment> payments = new ArrayList<Payment>(); 

       private String details; 
     } 

     @Entity 
     public class FixJoin extends SuperEntity implements Serializable { 

      public FixJoin() { 
       super(); 
      } 

      @ManyToOne(cascade={CascadeType.PERSIST,CascadeType.MERGE}) 
      @JoinColumn(name = "fixRequestID") 
      private FixRequest fixRequest; 

      @ManyToOne(cascade={CascadeType.PERSIST,CascadeType.MERGE}) 
      @JoinColumn(name = "fixID") 
      private Fix fix; 

      private String details; 
     } 

     @Entity 
     public class Fix extends SuperEntity implements Serializable { 

      @NotEmpty 
      @NotNull 
      private String type; 

      @NotEmpty 
      @NotNull 
      private String detail; 

      @Column(precision = 2) 
      @Min(value = 1) 
      private double cost; 

      @OneToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE},fetch=FetchType.LAZY,mappedBy="fix") 
      private List<FixJoin> requset_Fixes = new ArrayList<FixJoin>(); 
     } 

     @Entity 
     public class Payment extends SuperEntity implements Serializable { 

      @Transient 
      private static final long serialVersionUID = 1L; 

      @Column(precision = 2) 
      private double paidAmount; 

      @Enumerated(EnumType.STRING) 
      private PaymentMethod paymentMethod; 

      private int checkNumber; 

      private String bank; 

      private String payer; 

      private String reciever; 

      private String notes; 

      @ManyToOne(cascade={CascadeType.PERSIST,CascadeType.MERGE}) 
      @JoinColumn(name = "fixRequestId") 
      private FixRequest fixRequest; 
     } 

     @Stateless 
     public class QueryFacade { 

      @PersistenceContext 
      EntityManager entityManager; 


     public List<UnpaidFixRequestObject> getUnpaidFixRequestObjects(long partyID){ 
      TypedQuery<UnpaidFixRequestObject> typedQuery = entityManager.createNamedQuery(FixRequest.getGetNotPaidRequestsByPartyQuery(),UnpaidFixRequestObject.class); 
      typedQuery.setParameter(FixRequest.getGetNotPaidRequestsByPartyQueryPartyParam(), partyID); 
      return typedQuery.getResultList(); 
     } 
     } 

     @ViewScoped 
     @ManagedBean 
     public class PaymentFace { 

      @EJB 
      private FootprintEntityFacade<Payment> paymentFacade; 

      @EJB 
      QueryFacade queryFacade; 

      private List<Party> parties; 
      private List<UnpaidFixRequestObject> unpaidFixRequests; 

      private String selectedParty = ""; 
      private String selectedFixRequest = ""; 
      private Payment payment; 

      private boolean showCreditPaymentControls = false; 

      @PostConstruct 
      public void init() { 
       parties = new ArrayList<Party>(); 
       unpaidFixRequests = new ArrayList<UnpaidFixRequestObject>(); 

       parties = queryFacade.getAllParties(); 
       for (Party p : parties) { 
        p.setName(p.getID() + " - " + p.getName() + " - " + p.getAddress()); 
       } 
      unpaidFixRequests = queryFacade.getUnpaidFixRequestObjects(parties.get(0).getID()); 
     } 
    } 

任何帮助,将不胜感激。 在此先感谢。

+0

将您的查询,让我们看看在那里 –

+0

感谢什么去您的回复,下面是我最近我试图查询它返回null:选择新org.master.jpa。 UnpaidFixRequestObject(v.attributes.type,v.attributes.model,fr.ID,fr.requestDate,SUM(f.cost),SUM(p.paidAmount))从Vehicle v,FixRequest fr,Payment p,Fix f,FixJoin fj WHERE v = fr.vehicle AND fr = p.fixRequest AND fr = fj.fixRequest AND fj.fix = f AND v.party.ID =:partyID GROUP BY v.attributes.type,v.attributes.model,fr。 ID,fr.requestDate –

+0

请在正确编辑的帖子中放置,也..因为表很简单,添加您的实体映射。让我们看到整个图片 –

回答

0

好的尝试此查询,我添加了一些明确连接:

"Select new org.master.jpa.UnpaidFixRequestObject(v.attributes.type,v.at‌​tributes.model,fr.ID‌​,fr.requestDate,SUM(‌​f.cost),SUM(p.paidAm‌​ount)) " + 
      " From FixRequest fr" + 
      " inner join fr.payments p" + 
      " inner join fr.vehicle v" + 
      " inner join v.party pt" + 
      " inner join fr.requset_Fixes rf" + 
      " inner join rf.fix f" 
      " WHERE pt.ID=:partyID " + 
      " GROUP BY v.attributes.type,v.attributes.model,fr.ID,fr.requestDate" 
+0

抱歉,但ID没有工作因为你似乎不能添加JOIN后表(实体)别名,请检查图像[链接](https://www.dropbox。 com/s/kp1tzqi6oyv44rl/Untitled1.png?dl = 0)@Maciej Kowalski –

+0

这个小错字修正了一些错误,但仍有一些标有红色的,几乎完成请在这里查看图像[链接](https:/ /www.dropbox.com/s/wsodno8xb4yzdo2/Untitled2.png?dl=0)@Maciej Kowalski –

+0

运行查询,让我们看看在运行时会发生什么。那些语法检查工具有时是错误的。 –

0

写的@Maciej查询,并从SuperEntity的ID移动所有其他类更改模型。

实体层次结构的默认访问类型由映射注释放置在未明确指定访问类型的实体类和映射超类的属性上。

了解更多:Multiple @MappedSuperclass