2010-05-20 27 views
7

Có thể với JPA để truy xuất một phiên bản của các lớp không phải thực thể với các truy vấn gốc không?
Tôi có một lớp phi thực thể mà kết thúc tốt đẹp hai thực thể:Chọn phi thực thể có JPA?

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

Làm thế nào tôi có thể làm một cái gì đó như thế?

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

Trả lời

18

Có thể với JPA để lấy một thể hiện của một lớp phi thực thể với các truy vấn nguồn gốc?

số truy vấn Native có thể trở lại đơn vị chỉ (nếu bạn nói với họ làm như vậy bằng cách truyền resultClass hoặc một resultSetMapping với phương pháp createNativeQuery; nếu không, bạn sẽ nhận được bộ sưu tập dữ liệu thô) .

Trong JPQL, bạn có thể sử dụng biểu thức hàm tạo (SELECT NEW ...) với một hàm tạo không phải thực thể. Nhưng điều này không được hỗ trợ cho các truy vấn gốc, bạn sẽ phải thực hiện theo cách thủ công.

+0

Hi @Pascal Tôi cố gắng để sử dụng biểu thức constructor với một constructor không thực thể. SQL của tôi trông như thế này: 'SELECT NEW com.company.ui.EntityIDKey (c.companyId, c.name) FROM Công ty c WHERE c.companyId không phải là null và c.name không phải là null và length (trim (c.name))> 0 thứ tự bởi c.name asc' và mã JPA của tôi: 'List companies = getEntityManager(). CreateQuery (sql) .getResultList();' nhưng tôi kết thúc với một cảnh báo an toàn kiểu. Làm cách nào để tránh điều này? –

-1

Tôi nghĩ tôi đã tìm được giải pháp. Có một cách để sử dụng từ khóa MỚI trong việc xây dựng truy vấn. Những gì tôi đã làm để resovle vấn đề này:

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(); 
} 

Các ProductType là một đối tượng phi thực thể, một đối tượng đơn giản đơn giản thực hiện Serialiabale. Nhưng bạn cần xác định hàm tạo thích hợp.

Chúc mừng mã hóa :-)

Cảm ơn và Kính trọng, Hari

+1

Nhưng Redfield yêu cầu sử dụng toán tử MỚI trong truy vấn gốc! không phải truy vấn jpa. Vì vậy, có thể sử dụng truy vấn đó như createNativeQuery –

+0

Cảm ơn bạn, nhưng đó không phải là câu trả lời cho truy vấn gốc. – ForNeVeR

Các vấn đề liên quan