在hibernate中从多个表中检索数据

时间:2018-03-27 18:13:06

标签: java sql hibernate many-to-many

我在用户和广告之间存在多对多的关系,这些关系如此映射

    @ManyToMany(cascade = {CascadeType.ALL})
    @JoinTable(name = "faved_ads",
           joinColumns = {@JoinColumn(name = "advert_id", nullable = false, updatable = false)},
           inverseJoinColumns = {@JoinColumn(name = "user_id", nullable = false, updatable = false)})
public List<User> getFavouriters() {
    return favouriters;
}


    @ManyToMany(mappedBy = "favouriters")
public List<Advert> getFavourites() {
    return favourites;
}

如果我想查找特定用户喜欢的所有广告,如何从数据库中检索此数据?可以通过创建标准限制或预测来完成吗?

这就是我从一对多检索数据的方式,但无法获得多对多的类似解决方案

    public static <T> List<T> getList(Criteria criteria) {
    List<T> results = null;
    try {
        transaction = session.beginTransaction();
        results = criteria.list();
        transaction.commit();
    } catch (HibernateException ex) {
        transaction.rollback();
        ex.printStackTrace();
    } finally {
        session.close();
    }
    return results;
}

    public static List<Advert> usersAdverts(User user) {
    session = HibernateUtil.getSessionFactory().openSession();
    Criteria cr = session.createCriteria(Advert.class);
    cr.createAlias("user", "user");
    cr.add(Restrictions.eq("user.id", user.getId()));
    return getList(cr);
}

由于

2 个答案:

答案 0 :(得分:2)

我猜你不需要任何标准来查找某个用户喜欢的所有广告。它很简单:

public static List<Advert> usersAdverts(User user) {
    Hibernate.initialize(user.getFavourites());
    return user.getFavourites(); 
}

但是,如果user对象与会话分离 - 则打开一个新事务,重新读取该对象并按照我上面提供的方式初始化其集合(在从会话中分离user之前! )。

: - )

答案 1 :(得分:1)

对于有此问题的其他人,上述解决方案仅在查询数据库时有效,但是为了避免在使用Spark / Velocity函数时'Hibernate集合与任何会话无关'错误我必须将以下内容添加到代码:

    public static List<Advert> usersFavAdverts(User user) {
    session = HibernateUtil.getSessionFactory().openSession();
    session.refresh(user);
    Hibernate.initialize(user.getFavourites());
    return user.getFavourites();
}