简体   繁体   English

查询具有@ManyToMany 关系的表(休眠)

[英]Query for tables with @ManyToMany relation(Hibernate)

I rewrite my SpringMVC app with using Hibernate.I try to make query for selecting lectures for group of students by id of group.with using SQL query(before I started rewrite it with using Hibernate)this query was:我使用 Hibernate 重写了我的 SpringMVC 应用程序。我尝试通过使用 SQL 查询(在我开始使用 Hibernate 重写它之前)查询通过组的 id 为学生组选择讲座。这个查询是:

"SELECT * FROM lectures WHERE id IN (SELECT lecture_id FROM lectures_groups WHERE group_id =?) ORDER BY date_of_lecture"

I have Lecture and Group etities:我有 Lecture 和 Group etities:

@Entity
@Table(name = "lectures")
public class Lecture {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "lectures_groups", joinColumns = @JoinColumn(name = "lecture_id"), inverseJoinColumns = @JoinColumn(name = "group_id"))
    private List<Group> groups = new ArrayList<>();
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "teacher_id")
    private Teacher teacher;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "subject_id")
    private Subject subject;
    @Column(name = "date_of_lecture")
    private LocalDateTime date;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "audience")
    private Audience audience;

    public Lecture() {

    }
//getters setters
}

and:和:

@Entity
@Table(name = "groups")
public class Group {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Column(name = "group_name")
    private String name;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "cathedra_id", referencedColumnName = "id")
    private Cathedra cathedra;
    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "lectures_groups", joinColumns = @JoinColumn(name = "group_id"), inverseJoinColumns = @JoinColumn(name = "lecture_id"))
    private List<Lecture> lectures = new ArrayList<>();

    public Group() {

    }
//getters setters
}

I tried somthing like:我尝试了类似的东西:

List<Lecture> lectures = session.createQuery("select l from lectures l join l.groups g where g.id=:groupId")
                .setParameter("groupId", group.getId())
                .list();

but I get Exception: org.hibernate.hql.internal.ast.QuerySyntaxException: lectures is not mapped So how can i do it?但我得到 Exception: org.hibernate.hql.internal.ast.QuerySyntaxException: Lectures is not mapped 那么我该怎么做呢?

In hql query you need to provide the name of the entity in the query instead of the table name.hql查询中,您需要在查询中提供entity的名称而不是表名。 So in your case, you should replace lectures with Lecture in the query.因此,在您的情况下,您应该在查询中将lectures替换为Lecture

List<Lecture> lectures = session.createQuery("select l from Lecture l join l.groups g where g.id=:groupId")
                .setParameter("groupId", group.getId())
                .list();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM