2013-12-12 97 views
0

我有2個表Asset和Asset_Dist_Types。資產是父級,Asset_Dist_Types是子級表。 Asset_Dist_Types具有2列asset_id和lkp_dist_type,其中asset_id是Asset表中的主鍵。在Asset_Dist_Types中,它是多對多的(一個asset_id可以有多個lkp_dist_type條目。)在java中,我們只有Asset表的實體類。在Asset_Dist_Type中,他們已經提到它是元素的集合。在Asset.java中,Asset_Dist_Type的條目如下所示。HQL查詢未執行

@CollectionOfElements 
    @JoinTable(name = "ASSET_DIST_TYPE", joinColumns = @JoinColumn(name="ASSET_ID")) 
    @Column(name="LKP_DIST_TYPE") 
    private Set<Integer> distTypes = new LinkedHashSet<Integer>(0); 

現在我想更新Asset_Dist_Type表的lkp_dist_type列。我有資產ID的列表。我已經寫下面的查詢來更新它。

int hql = entityManager.createQuery(
    "update Asset a set a.distTypes = :distTypeParamId where a.assetId in (:assetIdParam)") 
.setParameter("distTypeParamId", distTypeList) 
.setParameter("assetIdParam", assetIdListToUpdateLOB) 
.executeUpdate(); 

但這扔

javax.persistence.PersistenceException: 
org.hibernate.exception.GenericJDBCException: could not execute update query. 

由於我是新來冬眠,我沒有得到該如何解決。有人可以幫幫我嗎?

+0

一些能幫助一個列表後.. !!!? – Sanjay

+0

在您的Hibernate配置('hibernate.cfg.xml')中,您可以添加' true',然後將所有生成的SQL語句記錄到控制檯。這已經可以幫助你,你可以將該語句複製到SQL終端並在那裏執行它,以查看它產生的錯誤。如果你仍然有問題,請。在終端中執行時發佈陳述和錯誤。 – Johanna

+0

感謝約翰娜的迴應..!我採取了不同的方式來完成它。 – Sanjay

回答

0

以不同的方式解決它..我得到了資產ID和分佈類型列表。我迭代了資產ID列表,併爲每個資產ID添加了分配類型列表並刷新它。它現在正在工作..!

獲得的資產ID的

for(int i=0;i<assetIdListToUpdateLOB.size();i++){ 

       int assetId = assetIdListToUpdateLOB.get(i); 
       System.out.println(assetId); 
       List<Asset> assetDetailsList = entityManager 
       .createQuery(
         "select distinct asset from Asset asset " 
           + "left join fetch asset.distTypes dt " 
           + "where asset.assetId = :assetIdParam") 
       .setParameter("assetIdParam", assetId).getResultList(); 
       if(assetDetailsList.size()>0){ 
       this.asset = assetDetailsList.get(0); 
       asset.getDistTypes().clear(); 
       asset.getDistTypes().addAll(selectedDistributionTypes); 
       entityManager.flush(); 
} 
}