Дублировать родительские и дочерние данные в jpql (JPA) - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть класс Production и класс сущностей ProductionDetail, где Id of Production table представляет собой ForeignKey как production_id в классе сущностей ProductionDetail, поэтому мой класс сущностей с отображением дал ниже

Класс производственной сущности:

@Entity
@Table(name = "tbl_production")
@XmlRootElement

public class TblProduction implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 45)
    @Column(name = "ID")
    private String id;

    @Column(name = "PRODUCTION_DATE")
    @Temporal(TemporalType.DATE)
    private Date productionDate;

    @Column(name = "START_DATETIME")
    @Temporal(TemporalType.TIMESTAMP)
    private Date startDatetime;

    @Column(name = "END_DATETIME")
    @Temporal(TemporalType.TIMESTAMP)
    private Date endDatetime;

    @Size(max = 45)
    @Column(name = "MACHINE_UUID")
    private String machineUuid;

    **Relation with Production Details Table**
    @OneToMany(mappedBy = "production")
    @XmlElement(name = "productionDetails")
    private List<TblProductionDetail> productionDetailList;


    @PrimaryKeyJoinColumn(name = "MACHINE_UUID", referencedColumnName = "UUID")
    @ManyToOne(fetch = FetchType.LAZY)
    private MstMachine mstMachine;

    @XmlTransient
    public MstMachine getMstMachine() {
       return this.mstMachine;
   }
} 

Сведения о производстве Класс сущности:

    @Entity
    @Table(name = "tbl_production_detail")
    @XmlRootElement
    public class TblProductionDetail implements Serializable {

        private static final long serialVersionUID = 1L;
        @Id
        @Basic(optional = false)
        @NotNull
        @Size(min = 1, max = 45)
        @Column(name = "ID")
        private String id;
        @Size(max = 45)
        @Column(name = "COMPONENT_ID")
        private String componentId;
        @Size(max = 45)
        @Column(name = "PRODUCTION_ID")
        private String productionId;

        **Relation with Production Class** 
        @ManyToOne
        @JoinColumn(name = "PRODUCTION_ID", referencedColumnName = "ID", insertable = false, 
                    updatable = false)
        private TblProduction production;

        @Transient
        public String componentCode;
        @Transient
        public String componentName;


        @PrimaryKeyJoinColumn(name = "COMPONENT_ID", referencedColumnName = "ID")  
        @ManyToOne(fetch = FetchType.LAZY)
        private MstComponent mstComponent;

        @XmlTransient
        public MstComponent getMstComponent() {
            return this.mstComponent;
        }
        public void setMstComponent(MstComponent mstComponent) {
            this.mstComponent = mstComponent;
        }
    }

Класс родительского списка:

  public class TblProductionList {
      private List<TblProduction> productionList;   
      public TblProductionList() {
            productionList = new ArrayList<>();
      }
      public List<TblProduction> getTblProductions() {
            return productionList;
      }
      public void setTblProductions(List<TblProduction> tblProductionList) {
            this.productionList = tblProductionList;
      }
  }

BusinessLogic (класс DAO):

       public TblProductionList getJson() {
            TblProductionList response = new TblProductionList();
            StringBuilder retrieveQuery = new StringBuilder();

            retrieveQuery.append(" SELECT prod FROM TblProduction prod ");
            retrieveQuery.append(" JOIN FETCH prod.productionDetailList ");
            retrieveQuery.append(" WHERE prod.endDatetime IS NULL ");
            retrieveQuery.append(" AND prod.machineUuid IS NOT NULL ");
            retrieveQuery.append(" AND NOT EXISTS (SELECT tpt FROM 
            TblProductionThset tpt WHERE prod.id = tpt.productionId) ");
            retrieveQuery.append(" AND EXISTS (SELECT mmfd FROM 
            MstMachineFileDef mmfd WHERE prod.machineUuid = mmfd.machineUuid 
            AND mmfd.hasThreshold = 1) ");
            retrieveQuery.append(" ORDER BY prod.id ");
            Query query = 
            entityManager.createQuery(retrieveQuery.toString());
            List thresholdList = query.getResultList();       
            response.setTblProductions(thresholdList);

            return response;
        }

По базе данныхЯ получаю ожидаемые основные дочерние данные, как показано ниже: enter image description here

После разработки этого класса сущностей я ожидаю, что получу 3 основных записи, в каждой записи которых есть 2 подробные записи. Но я получаю 6 дубликатов основных записей с 12 дочерними записями. Кто-нибудь может подсказать, пожалуйста, где мой код стал неправильным и почему возникла эта ситуация? пожалуйста, проверьте данные JSON, которые я получаю от API.

enter image description here

1 Ответ

0 голосов
/ 07 ноября 2019

измените список массивов на хэш-набор, тогда записи не будут повторяться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...