table.render({
elem: '#demo',
url: server + 'orders/getAllOrders',
cellMinWidth: 80,
size: 'lg',
title: 'orders',
cols: [
[ //标题栏
checkbox: true
field: 'order_no',
title: 'orderNo',
sort: true
field: 'uno',
title: 'uno',
sort: true,
align: 'center'
field: 'create_time',
title: 'createTime',
sort: true,
//特殊日期格式转换2018-12-03T17:17:36.000+08:00 转化为2018-12-03 00:00:00(正则表达式的方法)
templet: function(d) {
var dateee = new Date(d.create_time).toJSON();
var date = new Date(+new Date(dateee) + 8 * 3600 * 1000).toISOString().replace(/T/g, ' ').replace(/\.[\d]{3}Z/, '')
return date;
align: 'center'
,.....
@ClassName:ProductSelect
@Author:yyr
@Date:2019-04-16 9:54
@Description:分页查询使用条件类
@Data
public class ProductSelect {
//当前第几页
private int page;
//每页多少条数据
private int limit;
//模糊查询名称条件
private String name="";
//订单类型
private String selectType="";
//按某一列进行排序
private String field;
//排序方式(ASC/DESC)
private String order;
@ApiOperation(value = "条件查询订单详细信息并进行分页", notes = "条件查询订单详细信息并进行分页")
@ApiImplicitParam(name = "pro", value = "查询的条件", required = true, dataType = "ProductSelect")
@RequestMapping(value = "/getAllOrders", method = RequestMethod.GET)
public Object getAllOrders(ProductSelect pro) {
Sort sort=null;
if (pro.getField() == null) {
//默认时间降序排序
sort=new Sort(Sort.Direction.ASC,"create_time");
} else {
String s="desc";
if(pro.getOrder().equals(s)){
sort=new Sort(Sort.Direction.DESC,pro.getField());
}else{
sort=new Sort(Sort.Direction.ASC,pro.getField());
String type = pro.getSelectType();
String order_type = "";
if (type != "") {
switch (type) {
case "pro":
order_type = "PI";
break;
case "point":
order_type = "GI";
break;
case "demand":
order_type = "DE";
break;
default:
System.out.println("没有啦");
//接收的名称
String name = pro.getName();
//分页和排序
Pageable pageable= PageRequest.of(pro.getPage() - 1,pro.getLimit(),sort);
//条件查询后排序和分页后的数据
List<Map<String, Object>> list = productOrderDao.getAllOrders(name, order_type,pageable);
//条件查询后数据总条数
int total = productOrderDao.getTotal(name, order_type);
return MapTool.paging(list, total);
- MapTool工具类 (layui前台接收数据时有一定格式要求的,所以要按一定格式返回)
public class MapTool {
private static Map<String, Object> map = new HashMap<>();
public static Object paging(List<?> list, long count) {
map.put("count", count);
map.put("code", 0);
map.put("msg", "返回信息成功");
map.put("data", list);
return map;
public interface ProductOrderDao extends JpaRepository<ProductOrder,Integer> {
* 获取条件查询后的订单
* @param name 订单编号/客户编号/业务编号(产品订单+积份订单+需求订单 取三种订单的共同字段-订单编号,客户编号,订单状态,创建时间,业务编号)
* @param type 订单类型
* @param sort 分页排序
* @return
@Query(value = "select * from (SELECT p.order_no ,p.uno,p.order_status ,p.create_time ,(SELECT sno FROM users WHERE uno=p.uno)sno " +
" FROM product_order p UNION " +
"SELECT g.order_no,g.uno,g.status,g.charge_time,(SELECT sno FROM users WHERE uno=g.uno)sno FROM gift_charge g " +
"UNION SELECT d.orderno,d.uno,d.status,d.createtime, (SELECT sno FROM users WHERE uno=d.uno)sno FROM demands d " +
" ) p WHERE (order_no LIKE concat('%',?1,'%') OR uno LIKE concat('%',?1,'%') OR sno LIKE concat('%',?1,'%')) " +
" AND order_no LIKE concat('%',?2,'%') ",nativeQuery = true)
List<Map<String, Object>> getAllOrders( String name, String type, Pageable sort);
* 获取条件查询后订单的总数
* @param name 订单编号/客户编号/业务编号
* @param type 订单类型
* @return
@Query(value = "select count(*) from (SELECT p.order_no,p.uno,p.order_status,p.create_time,(SELECT sno FROM users WHERE uno=p.uno)sno " +
" FROM product_order p UNION " +
"SELECT g.order_no,g.uno,g.status,g.charge_time,(SELECT sno FROM users WHERE uno=g.uno)sno FROM gift_charge g " +
"UNION SELECT d.orderno,d.uno,d.status,d.createtime, (SELECT sno FROM users WHERE uno=d.uno)sno FROM demands d )t" +
" WHERE (order_no LIKE concat('%',?1,'%') OR uno LIKE concat('%',?1,'%') OR sno LIKE concat('%',?1,'%')) " +
" AND order_no LIKE concat('%',?2,'%') " ,nativeQuery = true)
int getTotal(String name, String type);
- 经测试可用,但需注意getAllOrders()sql编写:排序时可先正常编写sql,运行后检查控制台sql语句后跟随的排序是如何定义的,以创建时间升序为例-本接口下sql语句后跟随的是
order by p.create_time asc limit ?
后台sql中会自动给字段找了个别名引用,或许跟接口定义有关吧
ProductOrderDao extends JpaRepository<ProductOrder,Integer>
因此将查询后的数据重新放进另一张表并定义好别名p:
select * from (需要查询的数据) p
这样sql语句运行时就不会出现字段异常
Page<Map<String, Object>> getAllOrders( String name, String type, Pageable sort);
这样count就不需要手动再次编写,但是查询总数时出现问题 count查询语句不正确,因此放弃
最后分两步走,先条件查询数据,再条件查询count
前台使用的是layui由于后台jpa多表查询使用的是 List<Map<String, Object>> 自定义字段输出 因此时间create_time方面会出现问题,template定义的有解决方法.前台部分代码 table.render({ elem: '#demo', url: server + 'orders/getAllOrders'...
看了日志发现第一页域第二页的SQL显示不一样
select TOP(?) from 第一页
WITH query AS (SELECT inner_query.*, ROW_NUMBER() OVER (ORDER BY CURRENT_TIMESTAMP) as __hibernate_row_nr__ FROM 第二页
明显不一样的处理逻辑
select med.* fro
例如,有如下场景:
你需要根据table_a表的A字段的某些内容进行排序,让带有某些内容的数据优先显示,此时该字段A的内容并不是按照abcd这样的顺序进行排列,此时就需要用到自定义的排序操作。
先来看pgsql中的写法
SELECT a.A FROM table_a a ORDER BY CASE a.A WHEN '你好' THEN 1 WHEN '我好' THEN 2 WHEN '大家好' THEN 3 WHEN '是真滴好' THEN 4 END ASC
此时等于WHEN后面的字段内容就会按照
一、业务场景
先从播放时长表(play_time_table)中根据用户号(user_id)查出已观看视频总长度(按照任务号task_code、课程号course_code分组并使用sum得出),然后左连课程详情表(course_detail_table),获得每个课程的详细信息;
然后按照类似的条件,左连课程节数表(course_num_table),获得课程总节数(使用group by和count获得);
然后将这两个结果左连起来。
由于不熟悉jpa,当多表联查的返
@Query(value = "SELECT * FROM table_name WHERE condition = ?1 ORDER BY id DESC", countQuery = "SELECT COUNT(*) FROM table_name WHERE condition = ?1", nativeQuery = true)
Page<Entity> findByCondition(String condition, Pageable pageable);
其中,value属性为原生SQL语句,countQuery属性为查询总数的SQL语句,nativeQuery属性为true表示使用原生SQL查询。Pageable参数用于指定分页信息,包括页码、每页数量、排序等。
The type javax.servlet.http.HttpServletRequest cannot be resolved. It is indirectly reference 问题之解决