2013-09-27 4 views
0

엔티티가 있고 인터페이스가 JpaRepository<MyEntity, Long> 인 DAO가 있습니다. EclipseLink 사용.스프링 데이터 JPA - MySQL에서 findAll을 사용할 때의 예외

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

이런 식으로 : 나는 MySQL의 예외를 가지고

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

:

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

는 SQL

나는 DAO에서 다음과 같은 방법을 사용하고 있습니다 데이터베이스에서 실행되는 쿼리의 구문은 다음과 같습니다.

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)) 

스프링 데이터가 이러한 불필요한 중괄호를 추가하는 이유는 무엇입니까? 그것을 고치는 어떤 방법?

+0

'MyEntity' 클래스 코드 +'listOfIds'의 선언을 게시하십시오 – alfasin

+0

제공된'listOfIds'의 예제 선언문을 수정하십시오. 엔티티는'@ Entity'로 주석 처리 된 POJO입니다. – fracz

+0

어떤 OR 매퍼를 사용합니까? –

답변

3

FOUND 해결 과정 모든

먼저, DAO는 또한 JpaSpecificationExecutor<MyEntity>를 구현해야합니다. 이처럼 DAO를

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

및 사용 : 그런 다음,이 같은 사양 공장 클래스를 만들 예상대로

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

제작 쿼리가 지금이다.

관련 문제