2013-09-27 54 views
0

我有一個實體,並與接口JpaRepository<MyEntity, Long>的DAO。使用EclipseLink。春數據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 Data會添加這些不必要的大括號?任何方式來解決它?

+0

請張貼'MyEntity'類代碼+ listOfIds'的'在編輯'listOfIds' – alfasin

+0

提供的示例聲明的聲明。該實體是用'@ Entity'註解的POJO。 – fracz

+0

你使用哪個OR映射器? –

回答

3

FOUND替代方法

首先,你的DAO還必須實現JpaSpecificationExecutor<MyEntity>。 然後,創建一個規範,工廠類是這樣的:

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

生產的查詢是預期。