我不习惯寻求帮助,但我真的被困了几天。无法在Stackoverflow或Google上找到相同的问题...
我有两个实体Event和Artist,具有多对多的关系。联接表是EventArtists。
活动< - EventArtists - >艺术家
艺术家
@Entity
public class Artist {
@Id
@GeneratedValue
private Long idArtist;
private String name;
private String description;
@ManyToMany(mappedBy = "artists")
private Set<Event> events = new HashSet<Event>();
事件
@Entity
public class Event {
@Id
@GeneratedValue
private Long idEvent;
private String name;
private String description;
@ManyToMany(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY)
@JoinTable(name="EventArtists",
joinColumns=
@JoinColumn(name="idEvent"),
inverseJoinColumns=
@JoinColumn(name="idArtist")
)
private Set<Artist> artists = new HashSet<Artist>();
我正在尝试使用本机查询来获取事件及其关联的艺术家。 根据{{3}},我正在使用addEntity和addJoin。 由于这两个实体映射到相同的列名(id,name,description),我也使用别名。
这是我的要求:
NativeQuery nativeQuery = session.createNativeQuery("SELECT {e.*}, {a.*} "+
"FROM Event e "+
"LEFT JOIN EventArtists ea ON e.idEvent = ea.idEvent "+
"LEFT JOIN Artist a ON a.idArtist = ea.idArtist "+
"WHERE e.idEvent = :id");
nativeQuery.addEntity("e", Event.class)
.addJoin("a", "e.artists")
.setParameter("id", 1);
nativeQuery.getResultList();
nativeQuery.getResultList()抛出以下异常:
org.h2.jdbc.JdbcSQLException:未找到“A.IDEVENT”列
实际上,Hibernate无法正确生成请求。它查找列“a.idEvent as idEvent1_2_0 __,a.idArtist as idArtist2_2_0__”,它们是EventArtists的列。
我们得到:
选择 e.idEvent为idEvent1_1_0_, e.description as descript2_1_0_, e.name为name3_1_0_, a.idEvent为idEvent1_2_0__, a.idArtist为idArtist2_2_0__, a.idArtist为idArtist1_0_1_, a.description as descript2_0_1_, a.name为name3_0_1_ 从 事件e LEFT JOIN 活动艺术家ea ON e.idEvent = ea.idEvent LEFT JOIN 艺术家a 在a.idArtist = ea.idArtist 哪里 e.idEvent =?
而不是
选择 e.idEvent为idEvent1_1_0_, e.description as descript2_1_0_, e.name为name3_1_0_, a.idArtist为idArtist1_0_1_, a.description as descript2_0_1_, a.name为name3_0_1_ 从 事件e LEFT JOIN 活动艺术家ea ON e.idEvent = ea.idEvent LEFT JOIN 艺术家a 在a.idArtist = ea.idArtist 哪里 e.idEvent =?
这是一个完整的TestCase: documentation
HQL查询工作正常但我需要使用本机查询,因为where子句要复杂得多,并且依赖于数据库功能。
“FROM Event e LEFT JOIN FETCH e.artists WHERE e.idEvent =:id”
非常感谢您的协助。 谢谢