我有3个实体如下
@Entity
public class User {
@Id
@GeneratedValue
int userId;
String name;
@OneToMany(fetch = FetchType.EAGER)
List<Address> addressList = new ArrayList<Address>();
@OneToMany(fetch = FetchType.EAGER)
List<Vehicle> vehicles = new ArrayList<Vehicle>();
public User(String name) {
this.name = name;
}
public User(String name) {this.name=name;}
public User(List<Address> addressList) {this.addressList = addressList;}
/**
* getters amd setters
*/
}
@Entity
public class Address {
@Id
@GeneratedValue
private int addressId;
private String city;
}
@Entity
@Table(name = "VEHICLE")
public class Vehicle {
@Id
private int idVehcle;
private String manufacturer;
}
我需要选择在单个查询中将用户设为用户对象,其中包含addressList但不包含车辆。
地址和车辆实体都很渴望我无法改变,因为周围已经有很多代码。因此,如果我尝试在hql中获取用户并且它包含n行,则将有n个针对addressList的附加查询和针对车辆的另外n个查询(性能问题)。
如果我试试这个
String hql = "SELECT new User(u.name) FROM User u";
List<User> users = session.createQuery(hql).list();
只会执行一个查询,只会选择名称字段。 但如果我试试这个
String hql = "SELECT new User(u.addressList) FROM User u";
List<User> users = session.createQuery(hql).list();
由于生成的sql而引发异常。有没有人解决这个问题。
看起来https://forum.hibernate.org/viewtopic.php?f=1&t=991742他们也有同样的问题。
答案 0 :(得分:0)
创建一个新的用户类,其中车辆不急,然后使用它来进行选择。如果你扩展User类,你可以添加很少的代码
@Entity
public class User2 extends User {
@OneToMany(fetch = FetchType.LAZY)
List<Vehicle> vehicles = new ArrayList<Vehicle>();
public User2(String name) {super(name);}
public User2(List<Address> addressList) {super(addressList);}
}
这假设您的User类至少具有受保护的访问权限,它就在您的示例中。