Hibernate本机查询选择已加入多对多关联的实体

时间:2017-04-01 11:22:52

标签: java hibernate join many-to-many nativequery

我不习惯寻求帮助,但我真的被困了几天。无法在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”

  • 重命名列名以避免使用别名是一种解决方案,但这是不可能的。
  • 我正在使用Hibernate 5.2

非常感谢您的协助。 谢谢

0 个答案:

没有答案