2015-06-02 4 views
1

Я использовал стандартную реализацию JPA на некоторое время и не имел проблем с созданием динамических запросов, возникающих в результате алгоритмов поиска пользователей в базе данных. Однако мы переходим к Spring Framework (к сожалению, более старая версия - 3.2), и я просто не могу понять, как создать динамический запрос весной.Создать динамический запрос весной

С javax.persistance.EntityManager, я мог бы позвонить createQuery и дать ему строку для работы. Тем не менее, я обнаружил, что весной я могу использовать только что-то вроде следующего кода, где я определяю запрос в аннотации.

@Repository 
@SuppressWarnings("unused") 
public interface PersonRepository extends JpaRepository<Person, Long>, CrudRepository<Person, Long> { 

    @Override 
    List<Person> findAll(Sort sort); 

    @Override 
    List<Person> findAll(); 

    @Query("SELECT p FROM Person p ORDER BY p.lname ASC, p.fname ASC, p.mname ASC") 
    List<Person> findAllSort(); 

    @Query("SELECT p FROM Person p WHERE UPPER(p.userName) = UPPER(?1)") 
    Person findPersonByUsername(String username); 


} 

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

public List<Person> getPersons(List<Long> perIds) { 
    List<Person> persons; 
    String whereClause = ""; 
    for (int i = 0; i < perIds.size(); i++) { 
     if (i != 0) 
      whereClause += " OR "; 
     whereClause += "p.perId = '" + perIds.get(i) + "'"; 
    } 
    persons = em.createQuery("SELECT p FROM Person p WHERE " + whereClause).getResultList(); 
    return persons; 
} 

Может быть, лучше вопрос здесь спросить если это возможно, или я должен просто сохранить свою реализацию с помощью Менеджера сущностей. Это, как говорится, кто-нибудь recomend меня, чтобы изменить мой код с помощью EntityManager до использования Spring Framework?

+0

Можете ли вы выяснить это немного? Может быть, пример того, что вы хотите сделать? Когда вы говорите «переход от менеджера сущности к весеннему фрейму» ... это не имеет для меня никакого смысла, они не являются взаимоисключающими понятиями или даже обязательно связаны. – zmf

+0

То, что я действительно надеялся найти, было то, что Spring может иметь собственную реализацию метода createQuery, чтобы я мог выполнять либо JPA, либо наивный запрос. Однако, если Spring не предлагает собственную реализацию функции createQuery, я могу просто сохранить текущую реализацию. –

ответ

1

Spring позволяет использовать @Repository, но не силы вам сделать это. Spring даже предлагает приятный интерфейс JPA, который отделяет проблемы низкого уровня (определение источника данных и управление транзакциями) от высокоуровневых (DAO, с декларативными транзакциями).

В справочной системе Spring Framework имеется описание chapter. Вы также должны прочитать часть об управлении транзакциями в предыдущих главах.

+0

Спасибо за обновление; У меня была такая же идея, но я предположил, что весна может иметь собственную реализацию операций более низкого уровня. В этом случае я буду придерживаться своей текущей реализации. Еще раз спасибо! –

2

Я не знаю, можем ли мы делать то, что вы запрашиваете. Но у меня есть альтернатива вашему методу.

public List<Person> getPersons(List<Long> perIds) { 
    return em.createQuery(
     "SELECT p FROM Person p WHERE p.perId = " 
     + org.springframework.util.StringUtils.collectionToDelimitedString(perIds, " OR p.perId = ", "'", "'") 
    ).getResultList(); 
} 
+0

Это довольно удобный способ! Я буду помнить об этом в будущем, но это не совсем то, что я ищу. Насколько я понимаю, мои намерения могут быть невозможны весной. Спасибо за подсказку, хотя! Я просмотрю эту библиотеку и все, что у нее есть. –

1

Почему бы не использовать условие запроса IN?

Spring позволит вам сделать:

@Query("SELECT p FROM Person p WHERE p.perId in :ids") 
findPersonsInIdList(@Param("ids") List<Long> perIds); 
+0

Ваше решение будет работать для этого конкретного запроса, однако у меня есть другие запросы, созданные из более сложных алгоритмов, которые просто не смогут быть решены с использованием такого метода. Спасибо за подсказку, хотя! –

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