2012-10-12 93 views
2
package com.abc.def.model; 

import javax.persistence.Column; 
import javax.persistence.Id; 
import javax.persistence.Entity; 
import javax.persistence.Embeddable; 
import javax.persistence.IdClass; 
import java.util.Date; 
import java.io.Serializable; 



@NamedNativeQuery(name="getMetadata",query=" 
        select a.name alias1,a.fullname alias2, 
         b.name alias3,b.age alias4, 
         c.height alias5,c.something alias6, 
         d.otherthing alias7 
        from lame_table_name a, 
         lame_table_name_2 b 
        where a.id = b.id 
        and b.id = c.id 
        and c.id = d.id 
        and d.id = :namedparameter 
        order by a.index,b.index 
       ", 
      resultClass=MetadataModel.class) 


    @Entity 
    @IdClass(SomeIdClass.class) 

    public class MetadataModel{ 

    @Id @Column("alias1") 
    private Type alias1property; 

    @Id @Column("alias2") 
    private Type2 alias2property; 

    @Column("alias3") 
    private Type3 alias3property; 

    //getters and setters 
    } 

    @Embeddable 
    class SomeIdClass implements Serializable{ 

    //serialVersionUID line 

    @Id @Column("alias1") 
    private Type alias1property; 

    @Id @Column("alias2") 
    private Type2 alias2property; 

    //getter and setters 
    } 

的錯誤是SQL-17006,無效的列名,已經嘗試了這種設置的變化整天 我應該嘗試把列(「lame_table_name.name 「)休眠本地查詢:無效列名稱錯誤SQL-17006

我也嘗試過使用SqlResultSetMapping(並從POJO的字段中刪除了@Column)(並且指定了SqlResultSetMapping的columns屬性中的所有列別名)(我們是否應該在執行查詢時再次指定resultsetmapping SQLQuery接口的setResultSetMapping方法?)

package com.abc.def.model; 

import javax.persistence.Column; 
import javax.persistence.Id; 
import javax.persistence.Entity; 
import javax.persistence.Embeddable; 
import javax.persistence.IdClass; 
import java.util.Date; 
import java.io.Serializable; 
//other imports for the SqlResultSetMapping 



@NamedNativeQuery(name="getMetadata",query=" 
        select a.name alias1,a.fullname alias2, 
         b.name alias3,b.age alias4, 
         c.height alias5,c.something alias6, 
         d.otherthing alias7 
        from lame_table_name a, 
         lame_table_name_2 b 
        where a.id = b.id 
        and b.id = c.id 
        and c.id = d.id 
        and d.id = :namedparameter 
        order by a.index,b.index 
       ", 
      resultSetMapping="metaDataMapping") 


@SqlResultSetMapping(name="metaDataMapping", 
       [email protected](entityClass=MetadataModel.class, 
       fields = {@FieldResult(name="alias1Property",column="alias1") 
          //so on 
         } 

       ) 
      ) 

    @Entity 
    @IdClass(SomeIdClass.class) 

    public class MetadataModel{ 


    private Type alias1property; 


    private Type2 alias2property; 


    private Type3 alias3property; 

    //getters and setters 
    } 

    //composite class, exactly as above 

回答

0

好吧,早些時候我試圖在resultsetmapping中指定兩個列和實體屬性,所以我嘗試刪除實體映射,保留columns屬性,並調用aliastobean結果轉換器,加上編寫setter來接受BigDecimal Long(因爲它是一個Oracle數據庫),解決了這個問題...

0

嘗試使用@Column(name = "myprop")。還要注意Type/Type2/Type3必須是簡單類型(通常是整數/長/字符串/日期)。

+0

是的,它們都是Long,String,Date的其中之一 –

7

我們應該在Oracle的Select列表中包含所有表列。 如果我們只保留幾列。 例如, 您的表員工具有列FirstName,LastName,EmpId, ,如果您有查詢。

session.createSQLQuery("Select FirstName from Employee"); 

上述查詢不起作用。它會拋出無效列錯誤異常。 因此,最好將Select子句中的所有列放在Oracle中。

致謝: one answer 謝謝, Rajesh。

+0

謝謝。我幾乎花了整整一天的時間解決了這個問題,最終在這裏得到了解決方案 –

+0

歡迎Derick。 – Rajesh