2012-10-31 172 views
3

我有一個短暫的屬性的實體:接入領域

@Entity 
@Table(name = "asset") 
public class Asset { 
    @Transient 
    private String locationIdentifier = "N/A"; 

    @SuppressWarnings("unused") 
    @PostLoad 
    private void onPostLoad() { 
     if (location != null) { 
      locationIdentifier = location.getIdentifier(); 
     } 
    } 

    [other stuffs] 

    } 

我試圖訪問locationIdentifier這種方式在JPA:

String sqlString = "SELECT asset FROM Asset WHERE asset.locationIdentifier = :inputstr"; 
Query query = entityManager.createQuery(sqlString); 

但我得到了一個錯誤: Cannot resolve the property locationIdentifier

我想問一下我使用JPQL如何訪問locationIdentifier

對不起,我的英文。提前致謝!

回答

6

JPQL查詢被轉換爲SQL查詢和SQL查詢數據庫操作的數據。標記屬性瞬態意味着屬性不會持久保存到數據庫,因此不能從數據庫中查詢。

1

@Transient意味着該屬性被JPA完全忽略。它不能在查詢中引用。

只需刪除@Transient,它應該工作。

此外,您還需要提供參數值查詢:

String sqlString = "SELECT asset FROM Asset WHERE asset.locationIdentifier = :inputstr"; 
Query query = entityManager.createQuery(sqlString); 
query.setParameter("inputstr", someValue); 
+0

我知道,但是如果我們刪除'@Transient',JPA將在表中爲它創建一個列,並且我不需要它。順便說一句,非常感謝你。 –

+1

不幸的是,這是運氣不好。您必須擁有DB中的列才能在JPA查詢中使用它。想一想 - JPA查詢已轉換爲SQL,並完全在數據庫中執行。查詢不在java內存中執行。 SQL結果集使用JPA ORM映射轉換爲java對象/屬性。 :-) –

0

要麼你在你的數據庫表中添加列locationIdentifier和取消將其作爲過渡,或者你不能在查詢中使用此列。

0

您不能在查詢中使用臨時成員。這是沒有道理的! JPQL用於從數據庫中獲取某些內容,如果沒有「locationIdentifier」,則不能將其添加到where子句中。如果沒有這樣的數據庫字段,那麼你會在SQL中期待什麼?