2012-08-15 58 views
0

我已经走了两个实体与双向onetomany关联。我想使用带有投影的标准(仅从少数列中获取数据)获得许多带有许多Adress的许多Person。查询结果我想放入List<Map<String, Object>>。结果列表应该有这样的结构(地址数据应在父地址对象List<Map<String, Object>>包含):准则,预测,ALIAS_TO_ENTITY_MAP

[ 
    { 
    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); 

任何建议将是非常有益的。

回答

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()); 
} 

在此之后resultsList将包含您需要的结构。

+0

可以从查询中返回一个List >。 通过按照你写的,我从数据库中获取所有实体(我不想做的),并且我可能有许多数据库查询,每个'Person'获取'Adress'es。 – user1137146 2012-08-15 14:58:44