将 QueryDslRepositorySupport 与接口存储库结合使用

chr*_*yer 5 spring querydsl spring-data spring-data-jpa

由于我在spring论坛上没有得到回复,我会在这里尝试一下。

有没有办法拥有一个通用接口存储库,它通过以下方式由接口扩展:

@NoRepositoryBean
public interface CommonRepository<T> extends JpaRepository<T, Long>, QueryDslPredicateExecutor<T> {
 T getById(final long id);
}

@Repository
public interface ConcreteRepository extends CommonRepository<ConcreteEntity> {
  List<ConcreteEntity> getByNameAndAddress(final String name, final String address);
}

public class ConcreteRepositoryImpl extends QueryDslRepositorySupport implements ConcreteRepository {

    private BooleanExpression nameEquals(final QConcreteEntity entity, final String name) {
        return entity.eq(name);
    }

    public List<ConcreteEntity> getByNameAndAddress(final String name, final String address) {
        QConcreteEntity entity = QConcreteEntity.concreteEntity;
        return from(entity).where(entity.name.eq(name).and(entity.address.eq(address))).list(entity);
    }
}
Run Code Online (Sandbox Code Playgroud)

实现的问题是我必须getById(final long id) 在每个具体的类中实现。我不想那样做。通常,spring 数据会自动了解每个实体。我也想拥有QueryDslRepositorySupport. 在我的示例中,它通常会生成如下内容:

select .. from concreteentity en where en.id = ...
Run Code Online (Sandbox Code Playgroud)

有办法解决吗?我已经偶然发现 Spring Jpa 将自定义功能添加到所有存储库,同时将其他自定义功能添加到单个存储库

http://docs.spring.io/spring-data/data-jpa/docs/current/reference/html/repositories.html#repositories.custom-implementations

但我认为这些解决方案没有帮助,我也不完全了解如何使用它们来解决问题。

谢谢,

基督教

Tim*_*per 1

创建通用 getById 的一种方法QuerydslRepositorySupport如下

T getById(long id) {
    return getEntityManager().find(getBuilder().getType(), id)
}
Run Code Online (Sandbox Code Playgroud)