2015-06-01 8 views
3

Я работаю над веб-приложением, используя угловые значения js, spring mvc и spring jpa. Мне интересно, есть ли что-то похожее на критерии и detachedcriteria (hibernate) для создания расширенных запросов с данными весны jpa.Критерии весенних данных

+0

Возможный дубликат [Динамические данные весны jpa-запроса репозитория с произвольными предложениями AND] (http://stackoverflow.com/questions/28874135/dynamic-spring-data-jpa-repository-query-with-arbitrary-and-clauses) – iamiddy

ответ

3

Да, вы можете использовать Specifications, который в основном использует API критериев (очевидно, поскольку Spring Data JPA - это всего лишь оболочка JPA).

+0

Каков наилучший способ сохранить объект, ссылающийся на 2 других объекта? как это сделать только с одним запросом. (без их извлечения из базы данных). – housseminfo

+0

Вы должны задать это как новый вопрос (и принять мой ответ, если он поможет вам в первом вопросе). – dunni

+0

Также вы должны прочитать http://stackoverflow.com/help, особенно часть «Asking». – dunni

4

Ничто не мешает вам по-прежнему с использованием критериев

@Repository 
public interface FooRepository extends JpaRepository<Foo, Long>, FooRepositoryCustom { 

} 

interface FooRepositoryCustom { 

    public List<Foo> findByBar(Bar bar); 
} 

class FooRepositoryImpl implements FooRepositoryCustom { 

    @PersistenceContext 
    protected EntityManager em; 

    @Transactional(readOnly = true) 
    public List<Foo> findByBar(Bar bar) { 

     Criteria crit = em.unwrap(Session.class).createCriteria(Foo.class); 

     crit.add(Restrictions.eq("name", bar.getName())); 

     ... 

     crit.setResultTransformer(DetachedCriteria.DISTINCT_ROOT_ENTITY); 

     List<Foo> foos = crit.list(); 

     return foos; 

    } 
} 
1

вы можете использовать Query Dsl , он менее многословен, чем Specification, вот blog, содержащий как Specification и QueryDsl.

0

Вы можете использовать критерии с Spring Data, вам не нужен пользовательский репозиторий, Вы можете использовать JpaSpecificationExecutor, вот пример:

Ваше хранилище:

@Repository("yourRepository") 
public interface YourRepository extends JpaRepository, JpaSpecificationExecutor 
{ 
} 

ваш сервис

@Override 
public List<YourModel> yourDataModel getAllEntitiesByAttr(String attrValue){ 
    List<YourModel> yourDataModel = null; 
    try { 
    Specification specification=getAndSpecByAttribute("attribute",attrValue); 
    List list = userRepository.findAll(specification); 
    yourDataModel =orikaMapper.mapAsList(list, YourModel.class); 
    } catch (Exception e) { 
    throw e; 
    } 
    return yourDataModel; 
} 
private Specification getAndSpecByAttribute(String attribute, String valueAttribute){ 
return new Specification() { 
     @Override public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) { 
     Path path = root.get(attribute); 
     return cb.equal(path, valueAttribute); 
     }; 
    }; 
} 

Достаточно.

Смежные вопросы