Hibernate join不能将异常转换为多对多

时间:2014-07-19 11:45:44

标签: java sql hibernate hql

我有一个关于hibernate的问题。 我必须与多对多的关系课程,并尝试做出选择。问题是我得到了一个例外。你能帮忙吗?

@Entity(name = "pracownik")
@Inheritance(strategy = InheritanceType.JOINED)
@Proxy(lazy = false)
public class Pracownik extends Osoba {

@ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL })
@JoinTable(name = "grafikpracownika", joinColumns = { @JoinColumn(name = "idosoby") }, 
inverseJoinColumns = { @JoinColumn(name = "idgrafiku") })
private List<Grafik> grafiki = new ArrayList<>();
}

第二个实体

@Entity (name = "grafik")
@Proxy(lazy = false)
public class Grafik {

@ManyToMany (mappedBy = "grafiki",cascade = { CascadeType.ALL })
private List <Pracownik> pracownik  = new ArrayList<>();


}

我开发的方法是:

    public List<Pracownik> getWszyscyPracownicyGrafiku() {
    List<Pracownik> pracownicy = new ArrayList<>();
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    Transaction transaction = session.beginTransaction();
    Query query = session.createQuery("from pracownik as p join p.grafiki");
    pracownicy = query.list();
    transaction.commit();
    return pracownicy;
}

例外是:

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to model.Pracownik

知道出了什么问题吗?
我还想添加一个“where”但是在我摆脱这个异常后应该很容易。 我也试过“普通”sql

SELECT * from pracownik p join grafikpracownika g on p.idosoby = g.idosoby where idgrafiku = 6

但我得到的是:

org.hibernate.loader.custom.NonUniqueDiscoveredSqlAliasException: Encountered a duplicated sql alias [idosoby] during auto-discovery of a native-sql query

1 个答案:

答案 0 :(得分:1)

您从两个没有显式select子句的表中进行选择,因此Hibernate会生成一个元组(Pracownik, Grafik)列表。

如果您只需要Pracownik s(即需要加入才能在p.grafikiwhere创建条件),请使用

select distinct p from pracownik as p join p.grafiki

如果使用join来指示Hibernate获取关联的Grafik,请使用join fetch

from pracownik as p join fetch p.grafiki