2010-05-20 53 views
7

JPA可以用原生查詢檢索非實體類的實例嗎?
我有一個封裝兩個實體的非實體類:使用JPA選擇非實體?

class Wrap{ 
    Entity1 ent1; 
    Entity2 ent2 
} 
@Entity 
class Entity1{ 
    ... 
} 
@Entity 
class Entity2{ 
    ... 
} 

我怎麼能這樣做呢?

Query q = entityManager.createNativeQuery("native select here"); 
List<Wrap> list = q.getResultList(); 

回答

18

是否有可能與JPA檢索一個非實體類,並原生查詢的實例?

號機查詢可以返回實體只有(如果你告訴他們通過將resultClassresultSetMappingcreateNativeQuery方法這樣做;如果你不這樣做,你會得到原始數據的集合) 。

在JPQL中,可以使用具有非實體構造函數的構造函數表達式(SELECT NEW ...)。但是這不支持本地查詢,您必須手動執行。

+0

嗨@Pascal我想使用的構造函數表達式與非實體構造。我的SQL看起來像這樣:'SELECT NEW com.company.ui.EntityIDKey(c.companyId,c.name)FROM Company c WHERE c.companyId不爲空,c.name不爲空和長度(trim(c.name ))> 0 order by c.name asc' and my JPA code:'List companies = getEntityManager()。createQuery(sql).getResultList();'但我最終得到了一個類型安全警告。我如何避免這種情況? – 2014-11-06 15:15:29

-1

我想我找到了解決方案。 有一種方法可以在構建查詢時使用NEW關鍵字。 我做了什麼resovle這個問題:

public List<ProductType> getProductByName(String productName) { 
     String sqlQuery = "select DISTINCT **NEW** project1.ProductType(o.name, o.revision) from Lhproduct o where o.name = :prodname"; 
     Query qry = getEntityManager().**createQuery(sqlQuery);** 
     qry.setParameter("prodname",productName); 
     return qry.getResultList(); 
} 

的ProductType是一個非實體對象,實施Serialiabale一個簡單樸素的對象。但是你需要定義合適的構造函數。

快樂編碼:-)

感謝和問候, 哈日

+1

但是Redfield要求在本地查詢中使用operator NEW!不是jpa查詢。所以它可以使用該查詢作爲createNativeQuery – 2013-04-14 11:12:30

+0

謝謝,但這不是本機查詢的答案。 – ForNeVeR 2016-12-08 12:16:42