代码之家  ›  专栏  ›  技术社区  ›  fracz

Spring Data JPA-在MySQL中使用findAll时出现异常

  •  0
  • fracz  · 技术社区  · 12 年前

    我有一个实体,以及带有接口的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 回复  |  直到 12 年前
        1
  •  3
  •   fracz    12 年前

    找到了解决方法

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

    生成的查询现在如预期。

    推荐文章