代码之家  ›  专栏  ›  技术社区  ›  dEs12ZER

<expression>在spring data hibernate中预期的got<from>。

  •  0
  • dEs12ZER  · 技术社区  · 7 年前

    使用spring data和hibernate并尝试将此请求写入存储库:

        @Query("select u from AppUser u inner join u.roles r inner join u.contrats c where r = :role and not exists ( from c.project p where p = :project)")
    

    我的目标是从实体appuer获取appuser(用户)的列表,但是有条件的话,只有那些没有实体项目的用户。

    更详细地说,project和appuser之间有一个实体契约,它包含project project,appuser appuser。

    appuser和contart之间有一个到多个的映射(appuser可以有多个contart)。

    在contart和project之间也有一个到多个的映射(一个project可以有多个contart)。

    问题是这个请求返回一个空列表,而它应该返回一个12个用户的列表,因为他们没有指定的项目传递给它。

    我在请求中注意到(来自c.project p,其中p=:project)“from”用红线下划线表示:

    <expression> expected got <from> in spring-data hibernate.
    

    有什么想法吗?

    编辑

    实体应用程序用户

    @Entity
    @Data
    @AllArgsConstructor @NoArgsConstructor
    public class AppUser implements Serializable {
    
        @Id @GeneratedValue
        private Long id;
        @Column(unique = true)
        private String username;
        private String password;
        private String prenom;
        private String nom;
        private Long tel;
        private String cin;
        private String email ;
        @ManyToMany(fetch = FetchType.EAGER)
        private Collection<AppRole> roles = new ArrayList<>();
    
    
        @OneToMany(mappedBy = "appUser" )
        @Fetch(value = FetchMode.SUBSELECT)
        @JsonManagedReference(value="appuser-contrat")
        private Collection<Contrat> contrats = new ArrayList<Contrat>();
    
    
    
        public void addToContrats(Contrat contrat){
            this.contrats.add(contrat);
        }
    
    
    }
    

    实体合同

    @Entity
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Contrat implements Serializable{
    
            @Id @GeneratedValue
            private Long id;
            private Date dateDebut ;
            private Date dateFin ;
            private Long idDevloppeur;
            @ManyToOne
            @JoinColumn(name = "Id_Project")
            @JsonBackReference(value="projet-contrat")
            private Project project;
    
            @ManyToOne
            @JoinColumn(name = "Id_AppUser")
            @JsonBackReference(value="appuser-contrat")
            private AppUser appUser;
    
    
    }
    

    实体项目

    @Entity
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Project implements Serializable{
    
            @Id @GeneratedValue
            private long id;
            private String intitule;
            private String description;
    
            @OneToMany(mappedBy = "project" )
            @Fetch(value = FetchMode.SUBSELECT)
            @JsonManagedReference(value="projet-contrat")
            private Collection<Contrat> contrats  = new ArrayList<Contrat>();
    
    
    
            public void addToContrats(Contrat contrat){
                    this.contrats.add(contrat);
            }
    
    
    
     }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Michal    7 年前

    (在评论中发布解决方案摘要的答案)

    在给定的选择查询中“ inner join u.contrats “被使用,但没有用户的合同实体。解决方案:替换为“ left join u.contrats “。

    内部连接与左连接在此已解决 What's the difference between INNER JOIN, LEFT JOIN, RIGHT JOIN and FULL JOIN?