我有一个关于休眠的问题。
我必须与多对多关系的类,并尝试进行选择。问题是我要例外了。你能帮我吗?
@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
最佳答案
您从两个没有显式select
子句的表中进行选择,因此Hibernate会生成一个元组(Pracownik, Grafik)
的列表。
如果只需要Pracownik
(即需要联接才能在p.grafiki
中的where
上创建条件),请使用
select distinct p from pracownik as p join p.grafiki
如果使用join指示Hibernate提取关联的
Grafik
,请使用join fetch
:from pracownik as p join fetch p.grafiki