JPA查询PostgreSQL行排序问题

这篇具有很好参考价值的文章主要介绍了JPA查询PostgreSQL行排序问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题

  • 我们项目使用Spring Boot构建,使用JHipster生成业务代码,包含基础的增删改查代码
  • 使用PostgreSQL作为业务数据库,使用自动生成的JPA构建数据更新语查询
  • 在查询某个实体类的列表时,没有指定排序字段,查询返回按照添加顺序倒序返回,这样也符合我们的需求
  • 在修改了某个实体后,发现它在列表里的顺序变动了。顺序变动,没有固定排序,会对客户使用系统造成困惑
  • 一开始以为是在查询时加了修改时间倒序,查看代码后发现,没有更新时间字段,查询时也没有加排序字段
  • 这里放一段查询代码示例:
		Specification<AreaConfig> specification = (Specification<AreaConfig>) (root, query, cb) ->
        {
            List<Predicate> predicateList = new ArrayList<>();
            Join<AreaConfig, SmartIntersection> join = root.join("smartIntersection", JoinType.LEFT);
            predicateList.add(cb.equal(join.get("id").as(Long.class), smartIntersection.getId()));
            Predicate[] pre = new Predicate[predicateList.size()];
            pre = predicateList.toArray(pre);
            return query.where(pre).getRestriction();
        };
        return areaConfigRepository.findAll(specification);

处理

  • 查阅文档之后知晓:使用SELECT语句查询表中的数据时,PostgreSQL不确保按照一定的顺序返回结果
  • 这就要求,查询时,如果想要每次都按照一定顺序返回,就要指定排序字段
  • 一种写法时,在调用Repository查询方法(如.findAll)时传递参数指定Sort,代码示例如下:
        Specification<GreenWaveRouteConfig> specification = (Specification<GreenWaveRouteConfig>) (root, query, cb) ->
        {
            List<Predicate> predicateList = new ArrayList<>();
            Join<GreenWaveRouteConfig, GreenWaveRoute> join = root.join("greenWaveRoute", JoinType.LEFT);
            predicateList.add(cb.equal(join.get("id").as(Long.class), routeId));
            Predicate[] pre = new Predicate[predicateList.size()];
            pre = predicateList.toArray(pre);
            return query.where(pre).getRestriction();
        };
        return greenWaveRouteConfigRepository.findAll(specification, Sort.by("index"));
  • 另一种写法是,在specification里使用query.orderBy指定排序
        Specification<SignalManualControlLog> specification = (root, query, cb) ->
        {
            List<Predicate> predicateList = new ArrayList<>();
            if (intersectionId != null) {
                predicateList.add(cb.equal(root.get("intersectionId").as(Long.class), intersectionId));
            }
            //时间倒序
            query.orderBy(cb.desc(root.get("opTime")));
            Predicate[] pre = new Predicate[predicateList.size()];
            pre = predicateList.toArray(pre);
            return query.where(pre).getRestriction();
        };
        List<SignalManualControlLog> controlLogs = manualControlLogRepository.findAll(specification);

PostgreSQL排序相关

  • 在一般情况下,PostgreSQL查询的结果集会按照指定的排序规则返回。如果你使用了ORDER BY子句,那么查询结果会按照该子句指定的排序规则返回。
  • 然而,在某些情况下,PostgreSQL返回结果可能不是按照期望的顺序。这通常是由于数据的物理存储方式、索引使用、并行查询或查询优化器等因素导致的。如果数据表上没有合适的索引或统计信息,PostgreSQL可能会选择不同的访问路径,导致结果的顺序与预期不符。
  • 为了确保结果按照指定的顺序返回,你可以使用ORDER BY子句明确指定排序规则。另外,你还可以考虑使用适当的索引或统计信息来帮助PostgreSQL优化查询执行计划,以确保结果按照预期的顺序返回。
  • 此外,PostgreSQL也提供了一些查询提示和指令,比如ORDER BY子句中的ORDER BY ... USING,以及SET命令中的random_page_cost等,可以用来影响PostgreSQL查询优化器的行为,以确保结果按照一定的顺序返回。
  • 总的来说,虽然在一般情况下PostgreSQL会按照指定的排序规则返回结果,但是在一些特殊情况下可能会出现结果顺序不符合预期的情况。因此,在编写查询语句时,应该使用ORDER BY子句来明确指定排序规则,以确保结果的顺序是可预测的。

JPA相关介绍

  • JPA(Java Persistence API)是一种用于管理Java应用程序中持久化数据的API。它为开发人员提供了一种方便的方法来在数据库中存储、检索和管理对象。在使用JPA的过程中,开发人员经常需要执行各种类型的查询来检索数据。以下是一些常见的JPA查询介绍:文章来源地址https://www.toymoban.com/news/detail-801244.html

    1. JPQL(Java Persistence Query Language)查询:JPQL是一种面向对象的查询语言,类似于SQL,但是针对实体对象进行查询。它使用实体类和其属性名称而不是表名和列名来执行查询。开发人员可以使用JPQL来执行复杂的查询操作,如连接查询、聚合函数、条件过滤等。
TypedQuery<Customer> query = entityManager.createQuery("SELECT c FROM Customer c WHERE c.age > 18", Customer.class);
List<Customer> customers = query.getResultList();
    1. 命名查询:JPA还允许开发人员定义命名查询,以便在需要时轻松地引用和重用它们。开发人员可以在实体类上使用@NamedQuery注解来定义命名查询,然后在代码中使用实体管理器的createNamedQuery方法执行该命名查询。
@NamedQuery(name="Customer.findAllAdults", query="SELECT c FROM Customer c WHERE c.age > 18")
public class Customer {
    //...
}

TypedQuery<Customer> query = entityManager.createNamedQuery("Customer.findAllAdults", Customer.class);
List<Customer> customers = query.getResultList();
    1. Criteria API查询:JPA还提供了Criteria API,它允许开发人员使用类型安全的查询构建器来动态地构建查询。Criteria API可以用于构建复杂的查询,而不需要编写任何字符串形式的查询语句。
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Customer> query = cb.createQuery(Customer.class);
Root<Customer> root = query.from(Customer.class);
query.select(root).where(cb.greaterThan(root.get("age"), 18));
List<Customer> customers = entityManager.createQuery(query).getResultList();
  • 除了上述介绍的查询方式外,JPA还支持原生SQL查询、存储过程调用等其他查询方式。开发人员可以根据具体的业务需求选择适合的查询方式来操作持久化数据。

到了这里,关于JPA查询PostgreSQL行排序问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JPA连接达梦数据库导致auto-ddl失效问题解决

      现象:         项目使用了JPA,并且auto-ddl设置的为update,在连接达梦数据库的时候,第一次启动没有问题,但是后面重启就会报错,发现错误为重复建表,也就是说已经建好的表没有检测到,又重新走的建表流程。经过一天的排查,总结了2个解决方案。  问题的根源:

    2024年02月15日
    浏览(57)
  • MyBatis-Plus 查询PostgreSQL数据库jsonb类型保持原格式

    在这篇文章,我们保存了数据库的jsonb类型:MyBatis-Plus 实现PostgreSQL数据库jsonb类型的保存与查询 这篇文章介绍了模糊查询json/jsonb类型:PostgreSQL 查询json/jsonb是否存在某个片段 在模糊查询json/jsonb之前,我们得拿到正确的json/jsonb片段,比如我们模糊查询好几个连着的键值对,

    2024年02月15日
    浏览(58)
  • 【数据库】PostgreSQL中使用`SELECT DISTINCT`和`SUBSTRING`函数实现去重查询

    在PostgreSQL中,我们可以使用 SELECT DISTINCT 和 SUBSTRING 函数来实现对某个字段进行去重查询。本文将介绍如何使用这两个函数来实现对 resource_version 字段的去重查询。 1. SELECT DISTINCT 语句 SELECT DISTINCT 语句用于从表中选择不重复的记录。如果没有指定列名,则会选择所有列。在本

    2024年02月14日
    浏览(43)
  • 【java爬虫】将优惠券数据存入数据库排序查询

    本文是在之前两篇文章的基础上进行写作的 (1条消息) 【java爬虫】使用selenium爬取优惠券_haohulala的博客-CSDN博客 (1条消息) 【java爬虫】使用selenium获取某宝联盟淘口令_haohulala的博客-CSDN博客  前两篇文章介绍了如何获取优惠券的基础信息,本文将获取到的基本信息存到数据库中

    2024年02月16日
    浏览(49)
  • postgresql导入导出数据库的一些问题

    就创建一个空库,啥也不用管,也不用添加 postgis 之类的扩展 如果是不同节点之间迁移,建议先创建之前的用户,如果没有之前的用户导入时会导致表所有者是postgres

    2024年02月17日
    浏览(40)
  • MySQL 数据库查询与数据操作:使用 ORDER BY 排序和 DELETE 删除记录

    使用 ORDER BY 语句按升序或降序对结果进行排序。 ORDER BY 默认按升序排序。要按降序排序结果,使用 DESC 。 示例按名称按字母顺序排序结果: ORDER BY DESC 使用 DESC 以降序排序结果。 示例按名称以字母逆序排序结果: 您可以使用\\\"DELETE FROM\\\"语句从现有表格中

    2024年02月05日
    浏览(78)
  • Mysql 数据库DQL 数据查询语言 SELECT 基本查询、条件查询、聚合查询、分组查询、排序查询、分页查询——包含DQL所有查询语句。吐血分享。

    DQL:数据查询语言; 用来对表内的数据进行查找 。Database Query Language SQL语句分为:基本查询、条件查询、聚合查询、分组查询、排序查询、分页查询。  可以发现name字段就只剩下一个张三了;   条件: 条件查询—比较运算符 比较运算符 功能 大于 = 大于等于 小于 = 小于等

    2024年01月19日
    浏览(53)
  • 【JaveWeb教程】(20) MySQL数据库开发之 基本查询、条件查询、聚合函数、分组查询、排序查询、分页查询 详细代码示例讲解

    在上次学习的内容中,我们讲解了: 使用DDL语句来操作数据库以及表结构(数据库设计) 使用DML语句来完成数据库中数据的增、删、改操作(数据库操作) 我们今天还是继续学习数据库操作方面的内容:查询(DQL语句)。 查询操作我们分为两部分学习: DQL语句-单表操作

    2024年02月02日
    浏览(81)
  • SpringBoot集成Jpa对数据进行排序、分页、条件查询和过滤

    之前介绍了SpringBoot集成Jpa的简单使用,接下来介绍一下使用Jpa连接数据库对数据进行排序、分页、条件查询和过滤操作。首先创建Springboot工程并已经继承JPA依赖,如果不知道可以查看我的另一篇文进行学习,这里不做介绍。文章地址(https://www.cnblogs.com/eternality/p/17391141.htm

    2024年02月04日
    浏览(41)
  • 关于mysql数据库模糊查询的潜在问题

    初学者在学习的时候经常会写下面的模糊查询语句: 有两方面的问题,第一,我们从结果分析入手: 我们想看到的是什么,我们想看到的是蔡徐坤这个字符串能出现在我搜索的第一个位置,而不是我明明搜的蔡徐坤,蔡徐坤却出现在了最后面,前面一堆不太相干的。而之所

    2024年02月13日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包