2015-04-07 26 views
0

堅持我的POJO我有這樣的:與@Transient

@Transient 
private int qtyMentee; 

,在我的DAO我有這個疑問:

public List<Employee> findQtyMentee(){ 
    TypedQuery<Employee> query = (TypedQuery<Employee>) em.createNativeQuery(
     "select *, count(mentor_id) as qtymentee from employee group by id order by qtymentee asc" , Employee.class); 
    Collection<Employee> employee = (Collection<Employee>) query.getResultList(); 
    return (List<Employee>) employee; 
} 

當我試圖讓Qtymentee不斷返回0

註釋@Transient在這種情況下是錯誤的嗎?

如何獲取該值並在我的應用程序中顯示?

OBS:我正在使用Eclipselink。

謝謝。

+0

感謝的答案,但我只需要在特定的情況這個屬性。 如果我刪除它,Eclipselink將返回此錯誤: '錯誤500:列「qtymentee」不存在。 實際上,qtymentee是一個計算列。 –

回答

0

不支持您正在嘗試執行的操作。瞬態意味着它不是由JPA映射或處理的字段 - 它不被讀取或從數據庫中持久化。在這種情況下,您正在嘗試將計算的數據推送到實體字段,這會破壞由上下文維護的實體緩存。

希望您已將其映射爲對象模型中的1:M(稱爲employee.mentees)和M:1(稱爲employee.mentor)。如果是這樣,集合映射的簡單大小將返回「mentee」的數量,而不需要將值存儲在某處。

如果你想用值排序列表中直接返回,使用JPQL(而不是SQL與createNativeQuery法):

List<Object[]> list = createQuery("Select e, size(e.mentees) as qtymentee from Employee e order by qtymentee asc").getResultList(); 

如果你還沒有使用引用映射映射mentor_id場,你會需要訴諸使用子查詢,因爲我不相信你發佈的SQL查詢會起作用。

如果你必須把它放到一個數據對象,你可以使用這裏描述http://docs.oracle.com/cd/E15523_01/apirefs.1111/e13946/ejb3_langref.html#ejb3_langref_constructor

構造函數表達式它看起來是這樣的:

createQuery("select new DAO(e.id, e.otherfield .., size(e.mentees)) from Employee e") 
2

用@Transient標記的字段不會被保留。這意味着它們的值不存在於數據庫中,並且在查詢中使用它們將不起作用。從規格:

This annotation specifies that the property or field is not persistent.

Javadoc link

0

@Transient基本上意味着do not serialize me。所以@Transient可以防止你的字段被持久化。你應該刪除它。

+0

不要*堅持*我。序列化是另一回事...... –

+0

持久化與序列化幾乎相同。它不是通過消息通道發送序列化數據,而是發送到數據庫。 – mtyurt

相關問題