我已经使用双向onetomany关联两个实体。我想使用带有投影的条件(仅从少数几列获取数据)来获得许多Person
个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);
任何建议都会非常有帮助。
答案 0 :(得分: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 将包含您需要的结构。