【问题标题】:how to get data from manyToMany entities如何从manyToMany实体获取数据
【发布时间】:2021-05-26 22:29:22
【问题描述】:

我有两个实体用户和电影。我想为用户显示电影。用户将看到他们添加的电影。我将这两个实体与 manyToMany 连接起来,我正在尝试获取数据,但我遇到了这个错误。

2021-05-27 01:01:16.109 ERROR 4064 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.QueryException: could not resolve property: user of: com.moviePage.movieP.Entities.Movie [from com.moviePage.movieP.Entities.Movie m join m.user u where u.id = 1]; nested exception is java.lang.IllegalArgumentException: org.hibernate.QueryException: could not resolve property: user of: com.moviePage.movieP.Entities.Movie [from com.moviePage.movieP.Entities.Movie m join m.user u where u.id = 1]] with root cause

org.hibernate.QueryException: could not resolve property: user of: com.moviePage.movieP.Entities.Movie
    at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:77) ~[hibernate-core-5.4.30.Final.jar:5.4.30.Final]
    at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:71) ~[hibernate-core-5.4.30.Final.jar:5.4.30.Final]
    at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:2038) ~[hibernate-core-5.4.30.Final.jar:5.4.30.Final]
    at org.hibernate.hql.internal.ast.tree.FromElementType.getPropertyType(FromElementType.java:412) ~[hibernate-core-5.4.30.Final.jar:5.4.30.Final]
    at org.hibernate.hql.internal.ast.tree.FromElement.getPropertyType(FromElement.java:520) ~[hibernate-core-5.4.30.Final.jar:5.4.30.Final]
    at org.hibernate.hql.internal.ast.tree.DotNode.getDataType(DotNode.java:695) ~[hibernate-core-5.4.30.Final.jar:5.4.30.Final]
    at org.hibernate.hql.internal.ast.tree.DotNode.prepareLhs(DotNode.java:269) ~[hibernate-core-5.4.30.Final.jar:5.4.30.Final]
    at org.hibernate.hql.internal.ast.tree.DotNode.resolve(DotNode.java:209) ~[hibernate-core-5.4.30.Final.jar:5.4.30.Final]
    at org.hibernate.hql.internal.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:114) ~[hibernate-core-5.4.30.Final.jar:5.4.30.Final]
    at org.hibernate.hql.internal.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:109) ~[hibernate-core-5.4.30.Final.jar:5.4.30.Final]
    ...

用户

@Entity
@Table(name="user")
public class User {

    @Id
    @Column(name="user_id")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;

    @NotNull(message="Enter first name")
    @Column(name="name")
    private String name;

    @ManyToMany
    @JoinTable(
            name="user_movie", 
            joinColumns =@JoinColumn(name="user_id"), 
            inverseJoinColumns=@JoinColumn(name="movie_id"))
    private Set<Movie> movies;

电影

@Entity
@Table(name="movie")
public class Movie {

    @Id
    @Column(name="movie_id")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;

    @Column(name="title")
    private String title;

    @Lob
    @Column(name="summary")
    private String summary;

    @ManyToMany(mappedBy = "movies")
    private Set<User> users;

getMovies => 我把它放在数据访问层并从控制器调用它,然后从控制器将电影发送到 html 页面

public List<Movie> getMovies(int id) {
    Session session = entityManager.unwrap(Session.class);
    
    String hql = "from Movie m join m.user u where u.id = "+ String.valueOf(id);
    List<Movie> movies = session.createQuery(hql).list();
    System.out.println(movies);//tried to look what it will return 
    
    return movies;
}
    
    //List<Movie> movies = session.createQuery("from Movie m join m.user u where u.user_id=:user_id").setParameter("id", id).getResultList();

我已经尝试了这两个并且都产生了相同的错误。我无法理解错误请帮助:)

【问题讨论】:

    标签: spring-boot hibernate many-to-many


    【解决方案1】:

    你可能想要:

    String hql = "from Movie m join m.users u where u.id = "+ String.valueOf(id);
    

    【讨论】:

    • 非常感谢,但我不明白。为什么我们说用户
    • @garantör 因为这是 hql,而 hql 使用实体字段的名称,你可以在你的模型中看到,你有 @ManyToMany(mappedBy = "movies") private Set&lt;User&gt; users;,所以你必须使用 users (要仔细检查这一点,您可以将您的字段重命名为 user,然后您会看到您的旧查询有效)
    猜你喜欢
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多