gpt4 book ai didi

java - Hibernate 在单个查询中选择集合作为列

转载 作者:太空宇宙 更新时间:2023-11-04 14:05:53 25 4
gpt4 key购买 nike

我有 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;
}

我需要选择将用户作为单个查询中的User对象,其中包含地址列表但不包含车辆。

地址和车辆实体都是 Eager,我无法更改它,因为它周围已经有很多代码。因此,如果我尝试在 hql 中获取用户,并且它包含 n 行,则会有 n 个额外的地址列表查询和另外 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();

En 由于生成的sql而引发异常。有没有人能解决这个问题。

Looks like https://forum.hibernate.org/viewtopic.php?f=1&t=991742 they are having the same problems too.

最佳答案

创建一个新的用户类,其中车辆不急切,然后使用它进行选择。如果你扩展 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 类至少具有 protected 访问权限,如您的示例中所示。

关于java - Hibernate 在单个查询中选择集合作为列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28877904/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com