个人网站免费源码,代理网站官网,建设部网站注册查询,什么是手机网站建设文章目录 问题处理PostgreSQL排序相关JPA相关介绍 问题
我们项目使用Spring Boot构建#xff0c;使用JHipster生成业务代码#xff0c;包含基础的增删改查代码使用PostgreSQL作为业务数据库#xff0c;使用自动生成的JPA构建数据更新语查询在查询某个实体类的列表时#x… 文章目录 问题处理PostgreSQL排序相关JPA相关介绍 问题
我们项目使用Spring Boot构建使用JHipster生成业务代码包含基础的增删改查代码使用PostgreSQL作为业务数据库使用自动生成的JPA构建数据更新语查询在查询某个实体类的列表时没有指定排序字段查询返回按照添加顺序倒序返回这样也符合我们的需求在修改了某个实体后发现它在列表里的顺序变动了。顺序变动没有固定排序会对客户使用系统造成困惑一开始以为是在查询时加了修改时间倒序查看代码后发现没有更新时间字段查询时也没有加排序字段这里放一段查询代码示例 SpecificationAreaConfig specification (SpecificationAreaConfig) (root, query, cb) -{ListPredicate predicateList new ArrayList();JoinAreaConfig, 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代码示例如下 SpecificationGreenWaveRouteConfig specification (SpecificationGreenWaveRouteConfig) (root, query, cb) -{ListPredicate predicateList new ArrayList();JoinGreenWaveRouteConfig, 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指定排序 SpecificationSignalManualControlLog specification (root, query, cb) -{ListPredicate 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();};ListSignalManualControlLog 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相关介绍 JPAJava Persistence API是一种用于管理Java应用程序中持久化数据的API。它为开发人员提供了一种方便的方法来在数据库中存储、检索和管理对象。在使用JPA的过程中开发人员经常需要执行各种类型的查询来检索数据。以下是一些常见的JPA查询介绍 JPQLJava Persistence Query Language查询JPQL是一种面向对象的查询语言类似于SQL但是针对实体对象进行查询。它使用实体类和其属性名称而不是表名和列名来执行查询。开发人员可以使用JPQL来执行复杂的查询操作如连接查询、聚合函数、条件过滤等。
TypedQueryCustomer query entityManager.createQuery(SELECT c FROM Customer c WHERE c.age 18, Customer.class);
ListCustomer customers query.getResultList();命名查询JPA还允许开发人员定义命名查询以便在需要时轻松地引用和重用它们。开发人员可以在实体类上使用NamedQuery注解来定义命名查询然后在代码中使用实体管理器的createNamedQuery方法执行该命名查询。
NamedQuery(nameCustomer.findAllAdults, querySELECT c FROM Customer c WHERE c.age 18)
public class Customer {//...
}TypedQueryCustomer query entityManager.createNamedQuery(Customer.findAllAdults, Customer.class);
ListCustomer customers query.getResultList();Criteria API查询JPA还提供了Criteria API它允许开发人员使用类型安全的查询构建器来动态地构建查询。Criteria API可以用于构建复杂的查询而不需要编写任何字符串形式的查询语句。
CriteriaBuilder cb entityManager.getCriteriaBuilder();
CriteriaQueryCustomer query cb.createQuery(Customer.class);
RootCustomer root query.from(Customer.class);
query.select(root).where(cb.greaterThan(root.get(age), 18));
ListCustomer customers entityManager.createQuery(query).getResultList();除了上述介绍的查询方式外JPA还支持原生SQL查询、存储过程调用等其他查询方式。开发人员可以根据具体的业务需求选择适合的查询方式来操作持久化数据。