2013-11-27 137 views
0

我有一個遺留的表有很多列,我試圖限制休眠的列數。如果我只是從「from」子句運行到最後,它可以正常工作,加載每一列,但是當我添加「Select a.col1,a.col2 ...」等時,我得到一個對象數組而不是bean的實例。休眠選擇子句不起作用

我嘗試添加一個結果變壓器,但它似乎認爲第一列被命名爲「0」。我猜想在結果轉換器進入畫面時已經損壞了。我想知道,如果可能有一個案件不匹配,所以我把所有東西都變成了大寫,但這並沒有幫助。

UPDATE: 這裏的SQL:

Select a.SZ_ABND_NO, a.ASSET_VAL, a.FO_TYP, a.ASSET_ID, a.AGCY_RGN_CD, a.LIT_AGCY_CD, a.ASSET_TYP, a.SZ_AGCY_CD, a.SUB_OFC_ID, a.OFC_ID, a.CA_ID_AGCY, a.PROC_DIST from FlatAssetT a where a.ASSET_ID in (:assetList) order by a.ASSET_ID 

的bean是巨大的。這12列是數百(是複數)。我會給出一個選定的代碼片段。

@Entity 
@Table(name = "FLATASSET_T", schema="K702PRDR") 
public class FlatAssetT { 
    @Column(name="ADPT_DT", nullable=false) 
    private Date ADPT_DT; 

    @Id 
    @Column(name="ASSET_ID", nullable=false) 
    private String ASSET_ID; 

    @Column(name="ASSET_ID_TYP", nullable=false) 
    private String ASSET_ID_TYP; 

    @Column(name="SZ_ABND_NO", nullable=false) 
    private String SZ_ABND_NO; 
[etc.] 
    public String getSZ_ABND_NO() { 
     return SZ_ABND_NO; 
    } 
    public void setSZ_ABND_NO(String arg) { 
     this.SZ_ABND_NO=arg; 
    } 
    public String getASSET_ID() { 
     return ASSET_ID; 
    } 
    public void setASSET_ID(String arg) { 
     this.ASSET_ID=arg; 
    } 
    public Date getADPT_DT() { 
     return ADPT_DT; 
    } 
    public void setADPT_DT(Date arg) { 
     this.ADPT_DT=arg; 
    } 
    public String getASSET_ID_TYP() { 
     return ASSET_ID_TYP; 
    } 
    public void setASSET_ID_TYP(String arg) { 
     this.ASSET_ID_TYP=arg; 
    } 
[etc.] 
} 
+0

你可以幫助我們發佈你想要選擇的bean嗎?也許當前表的SQL創建?此外,不要忘記提及,如果你使用純粹的JPA或Hibernate API,它是HQL還是JPQL?使用hibernate標準API?它幫助我們嘗試和調試問題:) –

+0

@André - 使用HQL。該表不是由休眠創建的。它是一個遺留表格。用字符串用戶輸入密鑰(asset_id)非常簡單。除了它存在以外,我對標準API一無所知。我聽說「預測」在這裏很有幫助,但我不知道如何。 – user1187719

回答

0

除了bean的默認構造函數有一個走的是一套有限的參數(匹配那些你是從數據庫獲取),然後使用「選擇新爲myBean(..)的自定義構造函數。 ..' 句法。請參閱下面的鏈接以獲取更詳細的解釋。

New object with HQL

你也可以給別名每一列您選擇,然後填充圖所示

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html#queryhql-select

select new map(max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n) 
from Cat cat 

可能是你可以介紹一個構造函數來你的bean接受地圖,然後使用這個(加盟兩種方式)

+0

聽起來很整齊!但不幸的是,我想部分選擇是動態的。採用列返回列表的單個dao方法。這部分是因爲這是一個Web服務的一部分,我打算接受他們想要返回的信息列表。 – user1187719

+0

我忘了把at放在前面的評論中,所以我加了一秒,希望能夠通知你。 – user1187719

0

您可以使用此我進行查詢從的ThOD這article

它使用了Apache的BeanUtils。作者將參數的實現留給讀者作爲「作業」。

在本質上,查詢數據並遍歷結果創建新的bean實例和可用的數據設置爲它創建與豆新的列表。

public List find(final String hqlQuery) throws Exception { 

    List results = new ArrayList(); 
    Query query = SessionManager.currentSession().createQuery(hqlQuery); 
    Type beanType = query.getReturnTypes()[0]; 
    Class beanClass = beanType.getReturnedClass(); 
    String[] columns = extractColumns(hqlQuery); 
    String[] attributeNames = getAttributeFieldNames(columns); 
    String[] resultFieldNames = getResultFieldNames(columns); 
    Iterator iter = query.iterate(); 
    while(iter.hasNext()) { 
     Object[] row = (Object[]) iter.next(); 
     Object bean = beanClass.newInstance(); 
     for (int j = 0; j < row.length; j++) { 
      if (row[j] != null) { 
       initialisePath(bean, attributeNames[j]); 
       PropertyUtils.setProperty(bean, attributeNames[j], row[j]); 
      } 
     } 
     results.add(bean); 
    } 
    return results; 
    } 

    private static void initialisePath(final Object bean, final String fieldName) throws Exception { 
      int dot = fieldName.indexOf('.'); 
      while (dot >= 0) { 
       String attributeName = fieldName.substring(0, dot); 
       Class attributeClass = PropertyUtils.getPropertyType(bean, attributeName); 
       if (PropertyUtils.getProperty(bean, attributeName) == null) { 
        PropertyUtils.setProperty(bean, attributeName, attributeClass.newInstance()); 
      } 
      dot = fieldName.indexOf('.', dot + 1); 
      } 
    }