JPA如何使用OrderBy进行快捷排序或者多字段排序(方法名)

摘要:平常使用mysql直接使用sql语句进行书写,可是我们使用JPA就是不想写啊。这里我们使用快捷方法来写排序。

使用sql语句写OrderBy应该如下格式:

[ select 字段列表/* from 表名 where 条件 order by 字段名1 asc/desc, 字段名2 asc/desc,…]

数据库中的表信息

1
2
3
4
5
6
CREATE TABLE `user1` (
  `user_id` varchar(100) NOT NULL COMMENT '用户id',
  `name` varchar(100) DEFAULT NULL COMMENT '姓名',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

接着根据表信息,在实体类中使用注解进行映射

package com.example.demo.dao;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.Date;

/**
 * @Classname User1
 * @Description TODO
 * @Date 2019/8/27 14:50
 * @Created by lyc
 */
@Entity
@Data
@Table(name = "user1")
@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" })
public class User1 implements Serializable {


    @Id
    @Column(name = "user_id", length = 100)
    private String userId;

    @Column(name = "name", length = 100)
    private Integer name;

    @Column(name = "create_time", length = 32)
    private Date createTime;

    @Column(name = "weight", length = 11)
    private int weight;

}

再然后来写Dao接口,这里可以分为三种方法来写。

第一种方法:使用快捷方法来写

package com.example.demo.dao;

import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;

/**
 * @Classname User1Dao
 * @Description TODO
 * @Date 2019/8/27 14:53
 * @Created by lyc
 */
public interface User1Dao extends JpaRepository<User1,String> {

    /**
     * 根据name查询数据并按照CreateTime来进行倒序排列
     * @param name
     * @return
     */
    List<User1> getByNameOrderByCreateTimeDesc(String name);

    /**
     * 根据name查询数据并首先按照CreateTime来进行倒序排列,次要排序按照Weight顺序排列
     * @param name
     * @return
     */
    List<User1> getByNameOrderByCreateTimeDescWeightAsc(String name);
    
     /**
      * 假如你需要所有的数据而不需要按照条件查询,就要按照这样来写:
      * getBy+OrderBy+排序字段+排序方式
      * @return
      */
     List<User1> getByOrderByCreateTimeDesc();

    

}

第二种方法:使用原生sql来写

/**
 * @Classname User1Dao
 * @Description TODO
 * @Date 2019/8/27 14:53
 * @Created by lyc
 */
public interface User1Dao extends JpaRepository<User1,String> {

    /**
     * 根据name查询数据并按照CreateTime来进行倒序排列,
     * sql语句都是和数据库表中相对应
     * @param name
     * @return
     */
    @Query(value = "select * from user1 u where u.name = ?1 order by u.create_time desc ",nativeQuery = true)
    List<User1> getByNameOrderByCreateTimeDesc(String name);

    
}

第三种方法:使用hql来写

/**
 * @Classname User1Dao
 * @Description TODO
 * @Date 2019/8/27 14:53
 * @Created by lyc
 */
public interface User1Dao extends JpaRepository<User1,String> {

    /**
     * 根据name查询数据并按照CreateTime来进行倒序排列
     * @param name
     * @return
     */
    @Query(value = "select u from User1 u where u.name = ?1 order by u.createTime desc ")
    List<User1> getByNameOrderByCreateTimeDesc(String name);


}

备注:@Query注解 nativeQuery = true代表使用原生sql进行查询,否则使用hql

 

 

具体参考:https://suxiexingchen.github.io/2019/08/27/14/

可以使用 JPA 的 Criteria API 来实现通过 sum 函数排序的功能。具体步骤如下: 1. 创建 CriteriaBuilder 对象,用于构建 CriteriaQuery 对象。 2. 创建 CriteriaQuery 对象,指定查询的实体类和返回结果的类型。 3. 使用 CriteriaQuery 的 from 方法创建 Root 对象,表示查询的根实体。 4. 使用 CriteriaBuilder 的 sum 方法创建聚合函数表达式,指定需要 sum 的字段。 5. 使用 CriteriaQuery 的 select 方法指定查询的结果,将聚合函数表达式作为 select 方法的参数。 6. 使用 CriteriaBuilder 的 desc 方法创建降序排序排序规则。 7. 使用 CriteriaQuery 的 orderBy 方法指定排序的规则,将排序规则作为 orderBy 方法的参数。 8. 使用 EntityManager 的 createQuery 方法创建查询对象,将 CriteriaQuery 作为参数传入。 9. 调用查询对象的 getResultList 方法执行查询操作,返回查询结果。 下面是一个示例代码: ```java CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<Tuple> cq = cb.createTupleQuery(); Root<Order> root = cq.from(Order.class); Expression<BigDecimal> sumExpression = cb.sum(root.get("amount")); cq.multiselect(root.get("id"), sumExpression.alias("totalAmount")) .groupBy(root.get("id")) .orderBy(cb.desc(sumExpression)); List<Tuple> result = entityManager.createQuery(cq).getResultList(); ``` 以上示例代码中,假设 Order 实体类中有一个为 amount 的字段,需要对该字段进行 sum 操作,并按照 sum 后的结果进行降序排序。最终返回的查询结果为每个订单的 id 和对应的总金额。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值