2012-11-27 67 views
2

我有一个User类,它具有@OneToManyList<Address>属性。 Hibernate已经在用户和地址之间创建了一个连接表。当用户登录时,我使用自定义SQL查询查找用户;休眠定制查找器SQL查询不返回OneToMany关系

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

回答

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

@SotiriosDelimanolis你提到'我有,有一个@OneToMany列表

'用户类,对吧? 'List
'的字段名称是什么?我只是用它作为地址。需要相应地更改查询。 –

+0

@SotiriosDelimanolis然后您需要使用@ JoinTable注释来更新您的用户实体类,并使用Yogendra中描述的hql。请看这个例子,我无法测试功能,但应该给你一个想法,并在谷歌更多的资源:http://tadtech.blogspot.cz/2007/09/hibernate-annotation-one-to-many-join。 html – HRgiger

+0

@SotiriosDelimanolis这很好。我更新了答案。尝试使用更新后的查询。它应该与用户一起加载地址。 –

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. 
+0

我试过了,它没有填满我的清单。 –

+0

没有我的答案后发布的代码我使用'LAZY'获取类型为默认使用的关联。 –

+0

我的用例中的问题是用户保存在http会话中。在稍后的请求中,我们可能想要从用户处获取地址。如果休眠会话关闭,这会产生异常。 –