有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

将findAll与MySQL一起使用时,JavaSpring数据JPA异常

我有一个实体和接口为JpaRepository<MyEntity, Long>的DAO。使用日食

我使用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数据会添加这些不必要的大括号?有办法解决吗


共 (1) 个答案

  1. # 1 楼答案

    找到了解决办法

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

    然后像这样使用你的刀:

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

    生成的查询现在与预期一样