【问题标题】:How to display data from multiple tables using Spring data JPA - many to many relation如何使用 Spring data JPA 显示来自多个表的数据 - 多对多关系
【发布时间】:2018-01-22 09:57:58
【问题描述】:

我正在尝试从 Spring Data JPA 中的多个表中获取数据。

我有:

Professor.java

@Entity
public class Professor {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private Long id;
  private String username;

    private String password;

    private String firstname;

    private String lastname;

//Generated getters and setters

  @ManyToMany(mappedBy = "professors", fetch = FetchType.EAGER, cascade = { CascadeType.MERGE, CascadeType.PERSIST })
    private List<Classes> classes;

Classes.java

@Entity
public class Classes {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private Long id;

    private String name;

    @Lob
    private String description;

 @ManyToMany(fetch = FetchType.LAZY, cascade = { CascadeType.MERGE, CascadeType.PERSIST })
    private List<Professor> professors;

这些实体生成名为 'classes_professor' 的表和字段如下 classes_id 和professor_id

我正在尝试显示具有某些 ID 的教授,该 ID 已被赋予具有某些 ID 的课程。

ClassesRepository.java

@Repository
public interface ClassesRepository extends CrudRepository<Classes,Long>{

    @Query("SELECT p FROM Professor p join p.Classes c WHERE c.id =:id")
    public List<Professor> findProfessorNameById(@Param("id") long id);
}

Controller.java

public List<Professor> findProfessorNameById(@Param("id") long id){
        return classesRepository.findProfessorNameById(id);
    }

当我尝试运行它时,我遇到了这个错误:

could not resolve property: Classes of: com.oggi.model.Professor [SELECT p FROM com.oggi.model.Professor p join p.Classes c WHERE c.id =:id]

【问题讨论】:

标签: spring spring-data-jpa jpql jpa-criteria


【解决方案1】:

错误在于 p.Classes。它应该是 p.classes 因为你的教授 POJO 中的属性是用小写写的。

Query检查Professor POJO/Entity的属性;它不会寻找其他实体名称。

在顶部: 有时你写的是“profesor”,有时写的是“professor”。

【讨论】:

  • 是的,我的错误现在被删除了。我认为我的查询不能正常工作,因为我得到了表中所有教授的列表,而我应该只得到一个。你知道为什么吗? @马特
  • @dome 试试这个查询SELECT p FROM Professor p WHERE p.classes.id =:id
  • @Matt 您提到的查询将引发org.hibernate.QueryException: illegal attempt to dereference collection 异常,因为classes 是您尝试与一个ID 进行比较的集合。
  • 你当然是对的。我不知道我在想什么!它可能不再对发问者有帮助,但问题可能在于 id 生成。 ProfessorClasses 实体似乎使用 table-strategy 来生成 id,但我没有看到任何声明的 TableGenerator。遇到该问题的任何人都可以take a look at this answer
猜你喜欢
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 2018-04-14
  • 1970-01-01
  • 2020-09-12
  • 1970-01-01
  • 2015-10-28
  • 2019-10-01
相关资源
最近更新 更多