2012-08-24 78 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();