2012-08-24 158 views
0

我有這個類,例如:選擇在條件查詢

public class Person { 
    private Integer id; 
    private String name; 
    private Address address; 
} 

public class Address { 
    private Integer id; 
    private String street; 
    private String number;  

    ... 
} 

我想在JPA構建CriteriaQuery中該SQL

select p.name, d.street from Person p join Address d on d = p.address; 

我一定要創造Person類的構造函數和類Address對於這種特殊情況?

謝謝。

回答

0

where條件是無效的:

select p.name, d.street from Person p join Address d on d = p.address; 

它應該是這樣的:

select p.name, d.street from Person p join Address d on d.person_id = p.id; 

或:

select p.name, d.street from Person p join Address d on d.id = p.address_id; 

和構造函數Person類的例子:

//cTor I 
public Person(Integer id, String name, Address address){ 
    this.id = id; 
    this.name = name; 
    this.address = address; 
} 

//cTor II 
public Person(Integer id, String name, Integer addressId, String street, String number){ 
    this.id = id; 
    this.name = name; 
    this.address = new Address(addressId, street, number); 
} 
+0

好的,謝謝你的回答。現在我怎麼能用這個JPQL做一個Criteria? – Rodrigo

0

從JPQL select p.name, d.street from Person p join Address d on d = p.address; TO標準

與構造一個選項:

第一標誌在實體的關係 @ OneToOne/@一對多或等。 使用@JoinColumn 即

public class Person { 
      private Integer id; 
      private String name; 

      @JoinColumn(name="id", referencedColumnName = "id") 
      private Address address; 
} 

以後 爲您的結果類型創建一個班級

 public class Result(){ 
      String name; 
      String street; 

     /* you must have constructor here for the multi select later */ 
     public Result(String name,String street) { 
      this.name = name; 
      thi.street = street 
     } 
     } 

然後做(EM是實體管理器)

 CriteriaBuilder cb = em.getCriteriaBuilder(); 
     CriteriaQuery<PlaceSearch> query = cb.createQuery(PlaceSearch.class); 
    Root<Person> personRoot = query.from(Person .class); 
    Join<Person, Address> address= personRoot .join(Person_.address); 

    /* without meta model 
    Join<Person, Address> address= personRoot .join(person.get("address")); 
     */ 
/* we know Result has a construct of (String,String) . this is important for the      multi select here */ 

query.multiselect(person.get(Person_.name),address.get(Address_.street); 
List<Result> result = em. 

的createQuery(查詢).getResultList();