Spring Data JPA - 将findAll与MySQL一起使用时的异常

时间:2013-09-27 17:59:12

标签: java mysql jpa spring-data-jpa

我有一个实体,DAO有接口JpaRepository<MyEntity, Long>。使用EclipseLink。

我正在使用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添加这些不必要的括号的原因是什么?有什么办法解决吗?

1 个答案:

答案 0 :(得分:3)

找到替代方法

首先,您的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));

现在可以按预期生成查询。