账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    Springboot JpaSpecificationExecutor
    26
    0

    bean注入失败

    entity:

    @Entity
    @Table(name = "rolesInfo")
    public class JpaRolesInfo {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)//自增
        private Integer id;
        @Column(length = 15)
        private String roleName;//角色名称
        private Date time;//出现时间
        @Column(length = 2)
        private String weight;//角色分量

    DynamicRepository:

     @Repository
    public interface DynamicRepository extends JpaSpecificationExecutor<JpaRolesInfo>{
        List<JpaRolesInfo> findAll(Specification<JpaRolesInfo> spec,Integer id,String roleName);
    }

    JpaDynamicService:

    @Service
    public class JpaDynamicService {
        
        @Autowired
        private DynamicRepository repository;
        
        public List<JpaRolesInfo> findAll(Integer id, String roleName) {
            List<JpaRolesInfo> list =  repository.findAll((Root<JpaRolesInfo> root, CriteriaQuery<?> query, CriteriaBuilder cb)->{
                List<Predicate> predicates = new ArrayList<Predicate>();
                if(roleName != null)predicates.add(cb.like(root.get("roleName").as(String.class), "%" + roleName + "%"));
                if(id != null)predicates.add(cb.equal(root.get("id").as(Integer.class),id));
                return (Predicate) query.where(predicates.toArray(new Predicate[predicates.size()]));
            },id,roleName);
            return list;
        }
    
    }

    DemoController:

    @RestController
    @RequestMapping(value="/api/demo")
    public class DemoController {
        
        @Autowired
        private JpaDynamicService DyService;
        
        @RequestMapping(value="/test", method = RequestMethod.GET)
        public void test() {
            //动态查询(null,null)
            System.out.println("dynamic query:" + DyService.findAll(null, null));
            //动态查询(1,null)
            System.out.println("dynamic query:" + DyService.findAll(1, null));
        }

    错误信息:

    Description:
    
    Field repository in com.example.demo.service.JpaDynamicService required a bean of type 'com.example.demo.repository.DynamicRepository' that could not be found.
    
    The injection point has the following annotations:
        - @org.springframework.beans.factory.annotation.Autowired(required=true)
    
    
    Action:
    
    Consider defining a bean of type 'com.example.demo.repository.DynamicRepository' in your configuration.

    试了很多方法都不行。。。不知道该怎么写了。。。

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 0
    • 甜蜜危机 普通会员 1楼

      Spring Data JPA 提供了一个名为 JpaSpecificationExecutor 的接口,该接口允许我们在 Spring Boot 应用程序中执行复杂的动态查询,而无需编写具体的 SQL 语句。

      JpaSpecificationExecutor 接口定义在 org.springframework.data.jpa.repository.SpecificationExecutor 中,它为基于 JPA 的 Repository 提供了方法来处理 Specification 对象。

      java public interface JpaSpecificationExecutor<T> { List<T> findAll(Specification<T> spec); List<T> findAll(Specification<T> spec, Sort sort); Page<T> findAll(Specification<T> spec, Pageable pageable); T findOne(Specification<T> spec); long count(Specification<T> spec); }

      这里的 Specification<T> 是一个用于构建 WHERE 子句的泛型接口,我们可以根据业务需求自定义条件查询。

      例如,假设我们有一个 UserRepository 继承了 JpaRepositoryJpaSpecificationExecutor<User>,那么我们可以这样使用:

      ```java public class UserSpecifications {

      public static Specification<User> findByUsername(String username) {
          return (root, query, criteriaBuilder) -> 
              criteriaBuilder.equal(root.get("username"), username);
      }
      

      }

      userRepository.findAll(UserSpecifications.findByUsername("admin")); ```

      这段代码会生成一个查询所有用户名为 "admin" 的用户记录的 SQL。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部