我有一个
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;
}
尝试使用 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();
默认情况下,您启用了惰性属性关联,并且您需要调用
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.