【问题标题】:Spring Data JPA - exception when using findAll with MySQLSpring Data JPA - 将 findAll 与 MySQL 一起使用时出现异常
【发布时间】:2013-10-04 03:08:33
【问题描述】:

我有一个实体,以及接口JpaRepository<MyEntity, Long> 的DAO。使用 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 添加这些不必要的大括号的任何原因?有什么办法解决吗?

【问题讨论】:

  • 请发MyEntity类代码+listOfIds的声明
  • 在编辑中提供了listOfIds 的示例声明。该实体是一个带有@Entity 注释的POJO。
  • 您使用哪个 OR 映射器?
  • @MatthiasHerlitzius 抱歉,我不知道你在问什么
  • 那么您的问题可能与错误有关。请参阅此链接以及最后的错误报告链接:forum.spring.io/forum/spring-projects/data/…

标签: java mysql jpa spring-data-jpa


【解决方案1】:

找到解决方法

首先,您的 DAO 还必须实现 JpaSpecificationExecutor&lt;MyEntity&gt;。 然后,像这样创建一个规范工厂类:

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

生成的查询现在符合预期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 2016-05-21
    • 2015-06-13
    • 2017-09-02
    相关资源
    最近更新 更多