0

私は双方向の1対多の関連付けを持つ2つのエンティティに行きました。射影付きの基準を使用して(少数の列からのみデータを取得するため)、多くのesPersonを持つ多くのsを取得したいと思います。Adress入れたいクエリの結果List<Map<String, Object>>。結果のリストは次の構造を持つ必要があります(アドレスデータはList<Map<String, Object>>親アドレスオブジェクトに含まれている必要があります)。

[
   {
     name: "Andrew"
     surname: "..."
     adress : [
        {
            city : "New York"
            street : "..."
            type : "home"
        }
        {
            city : "..."
            street : "..."
            type : "work:
        }
     ]
  { 
     name: "..."
     surname : "..."
     address : [{....}]
   }
]

エンティティ:

public class Person{
     private Long id;
     private String name;
     private String surname;
     private Integer age;
     private String phoneNr;

     @OneToMany(cascade = CascadeType.ALL, mappedBy = "person", fetch = FetchType.LAZY)
     private List<Address> addresses

    // getters and setters
}


public class Address{
     private Long id;
     private String city;
     private String street;
     @ManyToOne(fetch=FetchType.LAZY)
 @JoinColumn(name="person_id")
     private Person person;


     // getters and setters
}

私が達成できたのは、エンティティ全体をロードすることだけでしたが、私のニーズを満たしていません。

Criteria criteria = currentSession().createCriteria(Person.class);
criteria.setFetchMode("addresses", FetchMode.JOIN);
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

どんな提案も非常に役に立ちます。

4

1 に答える 1

0

List<Map<String, Object>>クエリから返すことはできないと思います。必要な構造を取得する最も簡単な方法は、手動で作成することです (少なくとも私はそう思います)。

List<Map<String, Object>> resultsList = new ArrayList<Map<String, Object>>();
List<Person> persons = criteria.list();

for (Person person: persons) {
   resultsList.put("name", person.getName());
   resultsList.put("surname", person.getSurname());
   List<Map<Strin, Object>> addressesList = new ArrayList<Map<Strin, Object>>();
   for(Address address: person.getAddresses()) {
       addressesList.put("city", address.getCity());
       addressesList.put("street", address.getStreet());
       addressesList.put("type", address.getType());   
   }
   resultsList.put("name", person.ngetName());
}

この結果リストの後、必要な構造が含まれます。

于 2012-08-15T14:52:10.193 に答える