2013-09-27 2 views
0

У меня есть сущность и DAO с интерфейсом JpaRepository<MyEntity, Long>. Использование EclipseLink.Spring Data JPA - исключение при использовании findAll с MySQL

Я использую следующий метод из DAO:

Iterable<MyEntity> findAll(Iterable<Long> ids); 

таким образом:

List<Long> listOfIds = Arrays.asList(new Long[] {1,2,3}); 
Iterable<MyEntity> entities = dao.findAll(listOfIds); 

Я получил исключение MySQL:

java.sql.SQLException: Operand should contain 1 column(s) 

SQL, запрос, который выполняется в базе данных, имеет следующий синтаксис:

SELECT id, creation_date, column1, column2 FROM my_entity WHERE (id IN ((1,2,3))) 

Проблема в последних фигурных скобках - их слишком много. Рабочий запрос:

SELECT id, creation_date, column1, column2 FROM my_entity WHERE (id IN (1,2,3)) 

Любая причина, по которой данные Spring добавляют эти ненужные брекеты? Любой способ исправить это?

+0

Просьба указать код класса 'MyEntity' + объявление' listOfIds' – alfasin

+0

Приведенное объявление класса 'listOfIds' в редакторе. Объект представляет собой POJO, аннотированный с помощью '@ Entity'. – fracz

+0

Какой OR mapper вы используете? –

ответ

3

НАЙДЕНО РЕШЕНИЕ

Прежде всего, ваш DAO должен также реализовать JpaSpecificationExecutor<MyEntity>. Затем создать класс Specification-завод, как это:

public final class MyEntitySpecifications { 
    public static Specification<MyEntity> idsIn(final Collection<Long> ids) { 
     return new Specification<MyEntity>() { 
      @Override 
      public Predicate toPredicate(Root<MyEntity> root, CriteriaQuery<?> query, CriteriaBuilder cb) { 
       return root.get("id").in(ids); 
      } 
     }; 
    } 
} 

и использовать DAO, как это:

Iterable<MyEntity> entities = dao.findAll(MyEntitySpecifications.idsIn(listOfIds)); 

Произведено запрос теперь, как и ожидалось.

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