2015-08-14 19 views
0

我想調用基於輸入參數返回計算值的My-SQL函數。我使用本機查詢來達到這個目的,我能夠獲得除計算字段以外的所有字段。我總是得到NULL作爲計算字段的值。此外,如果我在SQL Client中執行相同的查詢,它會給出正確的結果。試圖在休眠模式下使用SQL函數

的Test.class

 @NamedNativeQueries({ 
     @NamedNativeQuery(
     name = "getTestData", 
     query = "Select test_id, BillType, Description, Material, Netvalue1, " 
       + "NetValue(billType, Netvalue1) as Sales_Rs " 
       + "from test1", 
     resultClass = Test.class 
     ) 
    }) 

    @Entity 
    @Table(name="TEST1") 
    public class Test { 

     private static final long serialVersionUID = 1L; 

     @Id 
     @GeneratedValue 
     @Column(name="TEST_ID") 
     private Integer test_id; 

     @Column(name="Billtype") 
     private String Billtype; 

     @Column(name="Description") 
     private String Description; 

     @Column(name="Material") 
     private String Material; 

     @Column(name="Netvalue1") 
     private Double Netvalue1; 

     @Transient 
     private Double Sales_Rs; 
// getters and setters 
. 
. 
. 
}; 

這是我如何打電話本地查詢:

@SuppressWarnings("unchecked") 
    @Override 
    public List<Test> getAllTestData() throws MyAppException { 
     List<Test> result; 

     try { 
      Session session = sessionFactory.getCurrentSession(); 

      Query query = session.getNamedQuery("getTestData"); 

      result = query.list(); 

     } catch (DataAccessException e) { 
      throw new MyAppException("Could not add a new record :", e); 
     } 

     return result; 
    } 

這裏存儲功能:

CREATE FUNCTION NetValue(billType CHAR(30), Netvalue1 DOUBLE) RETURNS double 
BEGIN 
    Declare RetValue DOUBLE; 

    SET RetValue = 
    CASE billType 
    WHEN 'A' THEN 0.10 * Netvalue1 
    WHEN 'B' THEN 0.05 * Netvalue1 
    WHEN 'C' THEN 0.025 * Netvalue1 
    ELSE Netvalue1 
    END; 

    RETURN RetValue; 
END; 
+0

你是直接使用Hibernate,而不是通過JPA? – wero

+0

我通過JPA使用hibernate。 –

回答

1

您已聲明字段Double Sales_Rs爲短暫的,因此它不是由Hibernate處理的。

兩個解決方案見this thread

a)使用Hibernate的具體映射通過調用數據庫函數的公式來計算Sales_RS

@Formula("NetValue(billType, Netvalue1)") 
private Double Sales_Rs; 

B)使用JPA @Postload註釋計算Sales_RS物體裝入後:

@Transient 
private Double Sales_Rs; 

@PostLoad 
private void onLoad() { 
    Sales_Rs = ... // same logic as in your db function 
} 

在兩個你可以刪除原生查詢並使用簡單的hql:

@NamedQueries({ 
    @NamedQuery(
     name = "getTestData", 
     query = "from Test" 
)})