Java 标准、投影、别名到实体映射

Java 标准、投影、别名到实体映射,java,hibernate,Java,Hibernate,我有两个实体和一个多人协会。我想使用带有投影的标准(仅从少数列中获取数据)来获取具有多个地址的多个Persons。我要放入列表的查询结果。结果列表应具有此结构(地址数据应为父地址对象中包含的列表): 实体: public class Person{ private Long id; private String name; private String surname; private Integer age; private String ph

我有两个实体和一个多人协会。我想使用带有投影的标准(仅从少数列中获取数据)来获取具有多个地址的多个
Person
s。我要放入
列表的查询结果
。结果列表应具有此结构(地址数据应为父地址对象中包含的
列表
):

实体:

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
}

任何建议都会很有帮助

我认为不可能从查询中返回
列表。
获取所需结构的最简单方法是手动创建(至少我认为是这样):

List resultsList=new ArrayList();
列表人员=标准。列表();
用于(人:人){
resultsList.put(“name”,person.getName());
resultsList.put(“姓氏”,person.getname());
列表地址列表=新的ArrayList();
for(地址:person.getAddresses()){
addressesList.put(“city”,address.getCity());
addressesList.put(“street”,address.getStreet());
addressesList.put(“type”,address.getType());
}
resultsList.put(“name”,person.ngetName());
}

在此结果之后,列表将包含您需要的结构。

可以从查询返回
列表。按照您编写的操作,我从数据库中获取所有实体(我不想这样做),并且我可能有许多数据库查询,每个
人一个
,以获取
地址。
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);
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());
}