Hibernate 自定义查找器 SQL 查询不返回 OneToMany 关系

问题描述 投票:0回答:2

我有一个

User
类,它具有
@OneToMany
List<Address>
属性。 Hibernate 在用户和地址之间创建了一个连接表。当用户登录时,我使用自定义 SQL 查询查找该用户;

select * from user where username = ? and password = ?

这显然会返回用户的所有其他字段,但不会返回

List<Address>
。 Hibernate 有没有办法在不使用自定义查询的情况下返回关系数据?

我可以通过上面的自定义查询加载用户,拉取其 ID,然后重新加载用户,以便 Hibernate 加载所有字段吗?还有更好的办法吗?

@Entity
public class User {

    @Id
    @GeneratedValue
    @GenericGenerator(name = "incremental", strategy = "increment")
    private Long userID;

    @Column(nullable = false)
    private String username;

    @Column(nullable = false)
    private String email;

    @Column(nullable = false)
    private String password;

    @OneToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "user_address", 
        joinColumns = @JoinColumn(name = "userID"), 
        inverseJoinColumns = @JoinColumn(name = "addressID"))
    private List<Address> addresses;
}

@Entity
public class Address {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @NonVisual
    public Long addressID;
}
java hibernate lazy-loading
2个回答
2
投票

尝试使用 HQL,如下所示:

String queryString = "select u from User u left join u.addresses "+
                     "where u.username = :userName and u.password = :password";

编辑:执行 HQL 的示例代码

String queryString = "select u from User u left join u.addresses "+
                     "where u.username = :userName and u.password = :password";
Query query = session.createQuery(queryString );
query.setParameter("userName", userNameValue);
query.setParameter("password", passwordValue);
List<User> users = query.list();

0
投票

默认情况下,您启用了惰性属性关联,并且您需要调用

getAddresses()
让用户检索惰性集合。

集合需要更多的工作来初始化 - 当然,您可以通过遍历整个集合来手动完成,但最好调用 Hibernate 实用程序类来为您完成此操作。

Hibernate.initialize
方法接受一个对象作为参数,并初始化任何惰性关联(这包括集合)。因此,如果您想完全初始化用户,然后完全初始化地址集合:

Object[] userObject; // the object returned by the query.
User u = new User(userObject); // create the user
Hibernate.initialize(u); // initializes user
Hibernate.initialize(u.getAddresses()); // pass the lazy collection into the session to be initialized.
© www.soinside.com 2019 - 2024. All rights reserved.