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

如何使用条件查询创建具有多个关系属性的JPA投影?

  •  0
  • Eduardo  · 技术社区  · 6 年前

    我有以下场景,在User@Entity中有一个组@Entity的@manytomynet集。我想使用一个DTO类返回一个投影,该类包含一些用户属性和集合。

    @Entity
    public class User {
        private String email;
        private String password;
    
        @JoinTable(name = "users_groups", joinColumns = {
            @JoinColumn(name = "user_pk")}, inverseJoinColumns = {
            @JoinColumn(name = "group_pk")})
       @ManyToMany(fetch = FetchType.EAGER)
       private Set<Permission> permissions;
    }
    
    @Entity
    public class Group {
        private String description;
    }
    
    
    public class DTO {
        private String email;
        private Set<Group> groups;
    
        public DTO(String email, Set<Group> groups) {        
            this.email = email;
            this.groups = groups;
        }
    }
    

    这是我尝试用jpa标准创建到dto类的投影的失败尝试。

    public DTO findByEmail(String email) {
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<DTO> cq = cb.createQuery(DTO.class);
        Root<User> root = criteriaQuery.from(User.class);
        Join<User, Group> groups = root.join("groups");
        criteriaQuery.where(cb.equal(root.get("email"), email));
        cq.select(cb.construct(DTO.class, root.get("email"), root.get("groups")));
    
        return em.createQuery(cq).getSingleResult();
    }
    

    我得到以下错误:

    • 原因:javax.persistence.persistence exception:org.hibernate.exception.sqlgrammareexception:无法提取ResultSet
    • 原因:org.postgresql.util.PSQLException:错误:语法错误位于或靠近“.”
    0 回复  |  直到 6 年前
    推荐文章