簡體   English   中英

Spring 數據 jpa 規范和可在 @manytomany 中使用連接表存儲庫進行分頁

[英]Spring data jpa specification and pageable in @manytomany using join table repository

我有一個用例使用單獨的連接表使用@manytomany關系對記錄進行過濾和分頁。 下面是關系和實體

   public class User {
        private Long userId;
        private String userName
        @OneToMany(mappedBy = "user")
        private List<UserRole> userRole;
    }
public class Role {
    private Long roleId;
    private String roleName
    @OneToMany(mappedBy = "role")
    private List<UserRole> userRole;
}

public class UserRole{
    private Long id;
    private Integer active
    @ManyToOne   
    @MapsId("userId")
    private User user;
    @ManyToOne   
    @MapsId("roleId")
    private Role role;
}
    @Repository
    public interface UserRoleRepository extends 
                       JpaRepository<UserRole, String>, 
                       JpaSpecificationExecutor<UserRole> {
    }
     public class UserRoleSpecification implements Specification<UserRole> 
     {
    
        private SearchCriteria criteria;
        
        public RuleEntitySpecification(SearchCriteria criteria ) {
            this.criteria = criteria;
        }
    
        @Override
        public Predicate toPredicate(Root<UserRole> root, 
                               CriteriaQuery<?> query,
                               CriteriaBuilder criteriaBuilder) {
            
          if(criteria.getOperation().equalsIgnoreCase("eq")) {
             if(root.get(criteria.getKey()).getJavaType() == String.class) 
             {
               return criteriaBuilder.like(root.get(criteria.getKey()), 
                                      "%" + criteria.getValue() + "%");
             } else {
               return criteriaBuilder.equal(root.get(criteria.getKey()), 
                                            criteria.getValue());
             }
           }
           return null;
        }
    
    }
    public class SearchCriteria implements Serializable {
    
        private String key;
        private String operation;
        private Object value;
    }
    UserRoleSpecificationBuilder specBuilder = new UserRoleSpecificationBuilder();
    
    specBuilder.with("active", "eq" , 1); // giving us proper result
    
    Specification<UserRole> spec = specBuilder.build();
    
    Pageable paging = PageRequest.of(0, 5, Sort.by("user.userId"));
    
    Page<UserRole> pagedResult = userRoleRepository.findAll(spec,paging);

但是,當我們嘗試基於規則/用戶表屬性(如 userName/roleName)進行過濾時specBuilder.with("user.userName", "eq", "xyz"); ,我收到以下異常:

    org.springframework.dao.InvalidDataAccessApiUsageException: 
    Unable to locate Attribute  with the the given name 
    [user.userName] on this ManagedType

請建議是否有任何方法可以使用 UserRole Join Table 存儲庫和規范來實現過濾器

因此也需要分頁,因此使用類型 UserRole JoinTable 的存儲庫。

    @Override
    public Predicate toPredicate(Root<UserRole> root,
                                 CriteriaQuery<?> query,
                                 CriteriaBuilder criteriaBuilder) {
      if (criteria.getOperation().equalsIgnoreCase("eq")) {
         String key = criteria.getKey();
         Path path;
         if (key.contains(".")) {
            String attributeName1 = key.split("\\.")[0];
            String attributeName2 = key.split("\\.")[1];
            path = root.get(attributeName1).get(attributeName2);
         } else {
            path = root.get(key);
         }
         if (path.getJavaType() == String.class) {
           return criteriaBuilder.like(path, "%" + criteria.getValue() + "%");
         } else {
           return criteriaBuilder.equal(root.get(key), criteria.getValue());
         }
      }
      return null;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM