【问题标题】:Spring boot join query Validation failed for query for method public abstract in using three entitySpring boot join query Validation failed for query for public abstract in using three entity
【发布时间】:2020-06-20 17:46:27
【问题描述】:

我使用的是弹簧靴。我曾经加入三个实体来获取存储库中的数据。但它显示以下错误..

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'menuRightRepo': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.List...  

Caused by: java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.List

我使用了下面的代码..

  1. 我的第一个名为 MenuNameEntity 的实体如下所示

    @Entity
    @Table(name = "MenuName")
    public class MenuNameEntity {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Column(name = "id")
     private long id;
    
     private String parentId;
     private String menuName;
     private String status;
     // getter and setter
     }
    
  2. 我的第二个实体在下面

    @Entity
    @Table(name = "MenuChild")
    public class MenuChildEntity {
    
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Column(name = "id")
     private long id;   
     private String parentId;   
     private String childMenuName;  
     private String url;    
     private String status;
     //getter and setter
    }
    
  3. 我的第三个实体在下面

    @Entity
    @Table(name = "MenuRight")
    public class MenuRightEntity {
      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      @Column(name = "id")
      private long id;
    
      private String companyId; 
      private String userId;    
      private String url;   
      private String status;    
      private String enqMode;   
      private String insertMode;    
      private String updateMode;    
      private String deleteMode;
     //getter and setter
     }
    
  4. 我的 MenuRightRepository 在下面

     public interface MenuRightRepo extends JpaRepository<MenuRightEntity, Long> {
    
      @Query("select new com.rms.info.MenuRightResponse(m.companyId, m.userId,m.enqMode,m.insertMode,m.updateMode,m.deleteMode, p.parentId,c.childId,c.childMenuName,c.url) from MenuNameEntity p,MenuChildEntity c,MenuRightEntity m where p.parentId = c.parentId  and p.status =1 and c.status =1 and c.url= m.url ")
     List<MenuRightResponse> getMenuMenuRights();   
    
    }
    
  5. 我已经使用 MenuRightResponse 来绑定从存储库中获取的值

      package com.rms.info;
      public class MenuRightResponse {
    
    private String companyId= "";
    private String userId= "";
    private String enqMode= "";
    private String insertMode= "";
    private String updateMode= "";
    private String deleteMode= "";
    private String parentId= "";
    private String childId= "";
    private String childMenuName= "";
    private String url= "";     
    
      public MenuRightResponse(String companyId, String userId, String enqMode, String insertMode, String updateMode,
        String deleteMode, String parentId, String childId, String childMenuName, String url) {
    super();
    this.companyId = companyId;
    this.userId = userId;
    this.enqMode = enqMode;
    this.insertMode = insertMode;
    this.updateMode = updateMode;
    this.deleteMode = deleteMode;
    this.parentId = parentId;
    this.childId = childId;
    this.childMenuName = childMenuName;
    this.url = url;
      }
    //getter and setter
     }
    

当我在 MenuRightRepo 中调用 getMenuMenuRights() 时,它会显示上述错误。我没有使用任何主键和外键。代码有什么问题。请帮帮我

【问题讨论】:

  • 选择新的com.rms.info.....???这应该是 sql,而不是 java 代码。如果你想使用纯 JPA,你必须定义你的实体。如果不使用连接定义实体,您可以使用带有映射功能的 spring jdbc 支持
  • @Alexander.Furer 我也试过@Query(value = "select m.companyId, m.userId,m.enqMode,m.insertMode,m.updateMode,m.deleteMode, p.parentId ,c.childId,c.childMenuName,c.url from MenuName p,MenuChild c,MenuRight m 其中 p.parentId = c.parentId and p.status =1 and c.status =1 and c.url= m.url " , nativeQuery = true) List getMenuMenuRights();
  • 此选择的结果集未映射到您的实体。您应该手动使用 jdbc 模板和映射
  • @Alexander.Furer 我需要在hibernate中显示上面查询的值如何使用三个实体来做到这一点?

标签: spring-boot spring-boot-jpa


【解决方案1】:

我已经解决了下面的问题...

  1. 我已将我的 MenuNameEntity 更改为

    @Entity
    @Table(name = "MenuName")
    public class MenuNameEntity {
    
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Column(name = "id")
     private long id;
    
    private String parentId;
    private String menuName;
    private String status;
    
     @OneToMany(fetch = FetchType.LAZY, mappedBy = "MenuName")  
     private Set<MenuChildEntity> menuChildEntities;
    
    // getter and setter
    }
    
  2. 我已将我的 MenuChildEntity 更改为

    @Entity
    @Table(name = "MenuChild")
    public class MenuChildEntity {
    
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Column(name = "id")
     private long id; 
    
     @Column(name = "parentId", nullable = false,insertable = false,updatable = false) 
     private String parentId;   
     private String childMenuName;  
     private String url;    
     private String status;
    
     @OneToMany(fetch = FetchType.LAZY, mappedBy = "MenuChild") 
     private Set<MenuRightEntity> menuRightEntities;
    
     @ManyToOne
     @JoinColumn(name = "parentId")
     private MenuNameEntity MenuName;
    
     //getter and setter
     }
    
  3. 我已将我的 MenuRightEntity 更改为

    @Entity
    @Table(name = "MenuRight")
    public class MenuRightEntity {
      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Column(name = "id")
     private long id;
    
     private String companyId; 
     private String userId;  
    
    @Column(name = "url", nullable = false,insertable = false,updatable = false)  
     private String url;   
     private String status;    
     private String enqMode;   
     private String insertMode;    
     private String updateMode;    
     private String deleteMode;        
    
     @ManyToOne
     @JoinColumn(name = "url")
     private MenuChildEntity MenuChild;
    
      //getter and setter
    
     }
    

我的存储库查询然后工作正常...我只是加入三个表无条件 一对多和多对一 并加入列 nullable false 工作很好

【讨论】:

    猜你喜欢
    • 2016-06-09
    • 2014-11-27
    • 2012-05-04
    • 1970-01-01
    • 2017-01-12
    • 2022-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多