2011-01-13 34 views
34

Tôi đang sử dụng TopLink yếu tố cần thiết (JPA) + GlassFish v3 + NetBean 6.9Làm thế nào để viết JPQL SELECT với id nhúng?

Tôi có một bảng với khóa chính tổng hợp:

table (machine) 
---------------- 
|PK machineId | 
|PK workId  | 
|    | 
|______________| 

tôi tạo 2 lớp thực thể một cho bản thân tổ chức và thứ hai là PK lớp học.

public class Machine { 
    @EmbeddedId 
    protected MachinePK machinePK; 

    //getter setters of fields.. 
} 

public class MachinePK { 
    @Column(name = "machineId") 
    private String machineId; 

    @Column(name = "workId") 
    private String workId; 

} 

Bây giờ .. làm cách nào để viết mệnh đề SELECT bằng JPQL với WHERE ???

Điều này không thành công.

SELECT m FROM Machine m WHERE m.machineId = 10 

http://www.mail-archive.com/[email protected]/msg03073.html

Theo trang web, thêm "val"? Không có nó cũng không thành công.

SELECT m FROM Machine m WHERE m.machineId.val = 10 

Trong cả hai trường hợp, lỗi này là:

Exception Description: Error compiling the query 
[SELECT m FROM Machine m WHERE m.machineId.val = 10], 
line 1, column 30: unknown state or association field 
[MachineId] of class [entity.Machine]. 

Trả lời

64
SELECT m FROM Machine m WHERE m.machinePK.machineId = 10 
+0

Cảm ơn! nó hoạt động: D –

+0

@ Masato-san: Bạn được chào đón. –

+0

Làm cách nào để chuyển đổi thành tiêu chí JPA? –

1

Thử nghiệm với Hibernate 4.1 và JPA 2,0

Tận dụng những thay đổi sau đây để làm việc:

Lớp Máy.java

public class Machine { 
    @EmbeddedId 
    protected MachinePK machinePK; 

    //getter & setters... 
} 

Lớp MachinePK.java

@Embeddable 
public class MachinePK { 
    @Column(name = "machineId") 
    private String machineId; 

    @Column(name = "workId") 
    private String workId; 

    //getter & setters... 
} 

... và cho truy vấn JPQL vượt qua tất cả các tên cột:

Query query = em.createQuery("SELECT c.machinePK.machineId, c.machinePK.workId, " 
       + "FROM Machine c WHERE c.machinePK.machineId=?"); 
query.setParameter(1, "10"); 

Collection results = query.getResultList(); 

Object[] obj = null; 
List<MachinePK> objPKList = new ArrayList<MachinePK>(); 
MachinePK objPK = null; 
Iterator it = results.iterator(); 
while(it.hasNext()){ 
    obj = (Object[]) it.next(); 
    objPK = new MachinePK(); 
    objPK.setMachineId((String)obj[0]); 
    objPK.setWorkId((String)obj[1]); 
    objPKList.add(objPK); 
    System.out.println(objPK.getMachineId()); 
} 
0

Nếu bạn sử dụng chú thích @Query, bạn có thể sử dụng yếu tố nativeQuery = true.

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