Spring Data JPA PageRequest 按 Map 值属性排序

标签 spring hibernate jpa spring-data spring-data-jpa

我的问题的简化版本:假设有两个实体,Fish 和 Chip。

Fish 与建模为 Map 的 Chip 具有一对多关系:

public class Fish {

    @OneToMany
    @JoinTable(name = "the_map",
            joinColumns = @JoinColumn(name = "fish_id"),
            inverseJoinColumns = @JoinColumn(name = "chip_id")
    )
    @MapKeyColumn(name = "the_key")
    private Map<Integer, Chip> chipsMap;
}

以下 HQL 查询生成有效的 SQL:

from Fish order by chipsMap[2].createDate

用 Spring Data 做同样的尝试

PageRequest pr = new PageRequest(0, 10, 
    Sort.Direction.ASC.fromString("chipsMap[2].createDate"));

fishRepository.findAll(pr);

抛出

org.springframework.data.mapping.PropertyReferenceException:
    No property chipsMap[2] found for type Fish!

Spring Data JPA 有问题吗?还是语法错误?

最佳答案

记录在案here , Sort 需要一个安全的表达式,因为它可能会使用未公开的属性,从而成为一个安全问题。参见 this CVE了解详情。

如果您知道自己在做什么并且没有使用潜在的恶意最终用户排序短语,则可以使用 JpaSort.unsafe(…)

关于Spring Data JPA PageRequest 按 Map 值属性排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45536472/

相关文章:

Java Spring框架-Bootstrap集成

java - 获取延迟加载的@ManyToOne 实体的@Id 始终返回 null

java - 在哪里放置用于在 Facade 模式中创建 namedQuery 的代码?

java - 如何将对象实例存储为 EJB3 实体的字段?

java - 如何使用 Spring AOP 实现基于注解的安全性?

java - 为什么新线程在事务性 Spring JUnit 测试中看不到主线程准备的测试数据?

hibernate - 将 hibernate 添加到 netbeans 中的现有 Web 应用程序?

java - 是否可以使用 apache tomcat 在客户端的应用程序中使用部署在 glassfish 中的 Web 服务?

java - 类加载器错误 - 加载器 org.springframework.boot.devtools.restart.classloader.RestartClassLoader 的未命名模块

java - JPA/Hibernate 在单个查询中选择具有子计数的所有父字段