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;      

    ...
}

この SQL 用に JPA で CriteriaQuery をビルドしたい

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

この特定の状況では、クラスPersonとクラスのコンストラクターを作成する必要がありますか?Address

ありがとう。

4

2 に答える 2

0

JPQL select p.name, d.street from Person p join Address d on d = p.address; TO 基準から

コンストラクター付きのオプション:

まず、エンティティ @OneToOne/@OneToMany などの関係をマークします。@JoinColumn ie を使用します。

    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(query).getResultList();

于 2013-12-09T11:45:36.637 に答える
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);
}
于 2012-08-24T18:05:04.293 に答える