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

时间:2015-03-05 12:29:23

标签: java hibernate

我有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他们也有同样的问题。

1 个答案:

答案 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类至少具有受保护的访问权限,它就在您的示例中。