【问题标题】:Duplicate parent and child data in jpql (JPA)jpql(JPA)中的重复父子数据
【发布时间】:2019-11-07 08:59:29
【问题描述】:

我有一个 Production 类和 ProductionDetail 实体类,其中 Production 表的 Id 是作为 ProductionDetail 实体类中的 production_id 的外键,所以我的两个带有映射的实体类都给出如下

生产实体类:

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

根据数据库,我得到预期的主子数据,如下所示

在设计完这个实体类之后,我期望我会得到 3 条主记录,其中每条记录都有 2 条详细记录。但是我得到了 6 个重复的主记录和 12 个子记录。任何人都可以向我建议我的代码在哪里出错以及为什么会出现这种情况?请检查我从 API 获得的 JSON 数据。

【问题讨论】:

  • 我们可以看看你的 DAO 代码吗,因为实体在我看来没问题。
  • 我添加了,请检查DAO代码。

标签: java jpa jax-rs jpql


【解决方案1】:

将您的数组列表更改为哈希集,然后记录不重复。

【讨论】:

  • HashSet 已应用,但找到了相同的结果。不要立即提出任何答案我的第二个问题是为什么?这意味着您应该解释原因。
猜你喜欢
  • 2019-01-07
  • 2022-11-12
  • 2015-12-23
  • 2015-10-02
  • 2019-03-16
  • 2018-06-08
  • 2011-02-14
  • 2018-04-11
  • 2019-04-28
相关资源
最近更新 更多