2010-05-20 52 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