2014-01-27 1 views
4

, так как я не получил ответа на весенний форум, я попробую здесь.Использование QueryDslRepositorySupport в сочетании с репозиториями интерфейса

Есть ли способ, чтобы иметь общее хранилище интерфейс, который расширен с помощью интерфейсов следующим образом:

@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); 
    } 
} 

Проблема с реализацией в том, что я должен реализовать getById(final long id) в каждом конкретном классе. Я не хочу этого делать. Обычно весенние данные автоматически узнают о каждом объекте. Также я хочу иметь функциональность QueryDslRepositorySupport. В моем примере это обычно создает что-то вроде:

select .. from concreteentity en where en.id = ... 

Есть ли способ решить эту проблему? Я уже наткнулся на Spring Jpa adding custom functionality to all repositories and at the same time other custom funcs to a single repository

и

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

, но я не думаю, что эти решения являются полезными, и я не совсем понимаю, как я могу использовать их, чтобы решить эту проблему.

Спасибо,

христианские

+0

Не могли бы вы исправить ссылки в конце вашего вопроса? –

+0

@ TimoWestkämper: исправлено это, извините. –

+0

Я бы тоже хотел услышать от эксперта. Я думаю, что простой ответ будет заключаться в том, что нам нужно создать отдельный репозиторий querydsl для объекта, отдельно от стандартного репозитория, но это похоже на lame. – chrismarx

ответ

0

Один из способов создать общий GetByID под QuerydslRepositorySupport подобно этому

T getById(long id) { 
    return getEntityManager().find(getBuilder().getType(), id) 
}