Spring Data JPA Querydsl不适用于投影

时间:2016-09-08 18:46:39

标签: spring-data spring-data-jpa projection querydsl

我已经实现了Spring Data JPA并将Querydsl用于搜索条件。如果在spring docs中给出了很少的更改,那么它可以正常工作。

我的REST控制器方法如下所示

@RequestMapping(value = "/testdsl", method = RequestMethod.GET)
 Iterable<User> index(
@QuerydslPredicate(root = User.class) Predicate predicate)
{
  return userRepository.findAll(predicate);
} 

并且下面给出了存储库,评论方法很好地为我提供了投影对象。

public interface UserRepository extends CrudRepository<User, Integer>,
QueryDslPredicateExecutor<User>, QuerydslBinderCustomizer<QUser>
{
  //Collection<OnlyName> findAllProjectedBy();
  //OnlyName findProjectedById(Integer id);

@Override
default public void customize(QuerydslBindings bindings, QUser root)
{

    bindings.bind(String.class)
    .first((StringPath path, String value) ->    path.containsIgnoreCase(value));
 }
 }

然后我实现了这个投影,我得到整个实体类的一个子集,作为响应返回。

public interface IUserProjection  {
 //...all required getters..
 }

现在我希望我的Querydsl返回这些投影对象。 我们有这样的组合样品吗?我正在使用spring boot 1.4.0.RELEASE

1 个答案:

答案 0 :(得分:0)

你可以这样做,但你需要一个具体的课程......

class UserProjection {

  @QueryProjection
  public UserProjection(long id, String name){
     ...
  }

}

然后你的查询看起来像(在QueryDSL 3中):

query.from(QTenant.tenant).list(new QUserProjection(QTenant.tenant.id, QTenant.tenant.name));

编辑:

查询queryDSL 4将如下所示:

List<UserProjection> dtos = query.select(new QUserProjection(QTenant.tenant.id, QTenant.tenant.name))
                              .from(tenant).fetch();