QuerydslPredicate 和泛型类

Posted

技术标签:

【中文标题】QuerydslPredicate 和泛型类【英文标题】:QuerydslPredicate and generic class 【发布时间】:2016-09-25 16:48:43 【问题描述】:

我有很多控制器,方法相同,区别只是实体类。

我想创建通用 BaseController 并遇到 QuerydslPredicate 注释问题(无法设置根,这是通用的)

class abstract BaseController<T extends BaseEntity> 
   @Autowired
   private Repository<T, Long> repository;

   @RequestMapping(method = RequestMethod.GET)
   public Page<T> findAll(@QuerydslPredicate Predicate predicate, Pageable pageable) 
      return repository.findAll(predicate, pageable);
   

Method extractTypeInfo from QuerydslPredicateArgumentResolver return T。但需要实体类。

而且我无法将根值设置为 QuerydslPredicate(没有类)

@QuerydslPredicate(root = T.class)

关于如何实现这一点的任何帮助?

【问题讨论】:

你有什么解决办法吗? 我也有同样的问题,有解决办法吗? 实际上我认为问题出在弹簧核心谓词设计中。谓词应设计为 Predicate 而不是合适的。 看看这个可能有帮助:***.com/questions/51111121/… 【参考方案1】:

我认为没有办法为注释提供泛型类。它应该是编译时常量。

但是这个怎么样? (大量代码,完整示例)。

弹簧底座

@SpringBootApplication
public class Application 

    public static void main(String[] args) 
        SpringApplication.run(Application.class, args);
    

实体

@MappedSuperclass
@Data
@NoArgsConstructor
@AllArgsConstructor
public abstract class BaseEntity 

    @Id
    @Column(name = "id")
    private Integer id;

    @Column(name = "created_at")
    private Date createdAt;


@Entity
@Table(name = "user")
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class User extends BaseEntity 

    @Column(name = "username")
    private String userName;


@Entity
@Table(name = "another_user")
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class AnotherUser extends BaseEntity 

    @Column(name = "another_username")
    private String anotherUserName;

控制器

public abstract class BaseEntityController<T extends BaseEntity> 

    private final BaseEntityRepository<T> repository;

    @Autowired
    protected BaseEntityController(BaseEntityRepository<T> repository) 
        this.repository = repository;
    

    @GetMapping(value = "/index")
    public Page<T> index(Predicate predicate, Pageable pageable) 
        return repository.findAll(predicate, pageable);
    


@RestController
@RequestMapping("/user")
public class UserController extends BaseEntityController<User> 

    protected UserController(BaseEntityRepository<User> repository) 
        super(repository);
    

    @Override
    public Page<User> index(@QuerydslPredicate(root = User.class) Predicate predicate, Pageable pageable) 
        return super.index(predicate, pageable);
    


@RestController
@RequestMapping("/anotheruser")
public class AnotherUserController extends BaseEntityController<User> 

    protected AnotherUserController(BaseEntityRepository<User> repository) 
        super(repository);
    

    @Override
    public Page<User> index(@QuerydslPredicate(root = AnotherUser.class) Predicate predicate, Pageable pageable) 
        return super.index(predicate, pageable);
    

存储库

@NoRepositoryBean
public interface BaseEntityRepository<T extends BaseEntity> extends CrudRepository<T, Integer>, QuerydslPredicateExecutor<T> 


@Repository
public interface UserEntityRepository extends BaseEntityRepository<User> 


@Repository
public interface AnotherUserEntityRepository extends BaseEntityRepository<AnotherUser> 

它尽可能地工作和抽象。不过,您仍然需要为每个 @Entity 生成额外的 @Controller@Repository 类。尽管它们大多是空存根。但我不认为你可以完全欺骗 @Querydsl 或 Spring Data 在联合中正确使用泛型。

【讨论】:

以上是关于QuerydslPredicate 和泛型类的主要内容,如果未能解决你的问题,请参考以下文章

JAVA——泛型类和泛型方法(静态方法泛型)

Java泛型:泛型类泛型接口和泛型方法

Java泛型:泛型类泛型接口和泛型方法

Java泛型知识点:泛型类泛型接口和泛型方法

java 16 -7 泛型方法和泛型接口(泛型类相似)

反射获取泛型类泛型方法