【Mybatis】未封装返回结果的字段自己返回值的问题
在spring boot中使用mybatis过程中,发现有个实体的时间字段未在mapper方法执行完的封装结果中进行封装,但是却有值返回。
如下展示问题:
实体如下:
package com.sxd.swapping.domain; import com.sxd.swapping.base.BaseBean;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.jpa.domain.Specification; import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.io.Serializable;
import java.util.*; @Entity
@Table
@Getter
@Setter
public class HuaYangArea extends BaseBean implements Serializable {
private static final long serialVersionUID = -1851783771574739215L; @Column(nullable = false)
private String areaName; @Column(nullable = false)
private Long areaPerson; public static Specification<HuaYangArea> where(HuaYangArea huaYangArea){ return new Specification<HuaYangArea>() {
@Override
public Predicate toPredicate(Root<HuaYangArea> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
//创建查询列表
List<Predicate> predicates = new ArrayList<>(); //字段areaName是否查询
String areaName = huaYangArea.getAreaName();
if (StringUtils.isNotBlank(areaName)){
predicates.add(criteriaBuilder.like(root.get("areaName"),"%"+areaName+"%"));
}
//字段areaPerson是否查询
Long areaPerson = huaYangArea.getAreaPerson();
if (areaPerson != null) {
predicates.add(criteriaBuilder.equal(root.get("areaPerson"),areaPerson));
} return criteriaQuery.where(predicates.toArray(new Predicate[predicates.size()])).getRestriction();
}
};
} }
package com.sxd.swapping.base; import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort; import javax.persistence.*;
import java.util.*;
import java.util.stream.Collectors; /**
* 基础bean
*/
@MappedSuperclass
public class BaseBean { @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;// 主键 自增 @Column(nullable = false, updatable = false)
private Date createDate = new Date();// 创建时间 private Date updateDate = new Date();// 修改时间 private String updateId; // 修改人 @Column(nullable = false)
private String createId; // 创建人 @Column(nullable = false)
private String uid; //业务主键 @Transient
private Integer pageNum = 0; //分页 页号 @Transient
private Integer pageSize = 10; //分页 页量 public Long getId() {
return id;
} public void setId(Long id) {
this.id = id;
} public Date getCreateDate() {
return createDate;
} public void setCreateDate(Date createDate) {
this.createDate = createDate;
} public Date getUpdateDate() {
return updateDate;
} public void setUpdateDate(Date updateDate) {
this.updateDate = updateDate;
} public String getUpdateId() {
return updateId;
} public void setUpdateId(String updateId) {
this.updateId = updateId;
} public String getCreateId() {
return createId;
} public void setCreateId(String createId) {
this.createId = createId;
} public String getUid() {
return uid;
} public void setUid(String uid) {
this.uid = uid;
} public Integer getPageNum() {
return pageNum;
} public void setPageNum(Integer pageNum) {
this.pageNum = pageNum;
} public Integer getPageSize() {
return pageSize;
} public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
} public void initEntity(){
this.createDate = new Date();
this.createId = UUID.randomUUID().toString();//如果有当前登陆人,则初始化为当前登陆人
this.uid = UUID.randomUUID().toString();
} public void updateEntity(){
this.updateDate = new Date();
this.updateId = UUID.randomUUID().toString();//如果有当前登陆人,则赋值为当前登陆人
} /**
* 分页 工具方法
* @return
*/
public PageRequest page(){
return PageRequest.of(pageNum,this.pageSize);
} /**
* 分页 排序工具方法
*
* 中文字段排序 需要在查询出来后处理 sort无法解决中文排序的问题
* @param map
* @param obj
* @return
* @throws Exception
*/
public PageRequest page(Map<String,Sort.Direction> map,Object obj) throws Exception{
//反射获取实体所有属性
List<String> properties = Arrays.stream(obj.getClass().getDeclaredFields()).map(i->i.getName()).collect(Collectors.toList());
Set<String> keySet = map.keySet();
Sort sort = null;
if (properties.containsAll(keySet)){
for (String str:keySet){
if (sort == null){
sort = Sort.by(map.get(str),str);
}else{
sort = sort.and(Sort.by(map.get(str),str));
}
}
}else{
throw new Exception("排序字段非本实体字段");
}
return PageRequest.of(this.pageNum,this.pageSize,sort);
}
}
Mapper.java如下:
public interface HuaYangAreaMapper { /**
* 根据业务主键查询
* @param uid
* @return
*/
@Select("SELECT * FROM hua_yang_area where uid = #{uid}")
@Results({
@Result(property = "areaName",column = "area_name",javaType = String.class),
@Result(property = "areaPerson",column = "area_person",javaType = Long.class),
@Result(property = "createId",column = "create_id",javaType = String.class)
})
HuaYangArea findOne(String uid);
调用这个方法,返回结果如下:
如上所示,因为createDate和updateDate都没有在结果集进行封装,所以按道理来说应该是获取不到值的嘛,但是这里却能获取到值。
,展示结果集封装
追溯原因:
最后找到根源,原来是因为在实体类中,部分不按逻辑出牌的字段 进行了new操作
所以,如果想要mybatis查询的结果集完全按照自己封装的效果来进行返回,就可以将这里的初始化给去掉!!!!
【Mybatis】未封装返回结果的字段自己返回值的问题的更多相关文章
- mybatis plus 增删改自动填充字段值
说明 本文实现以下需求效果 创建数据时自动填充 createUserId 和 createTime 更新数据时自动填充 updateUserId 和 updateTime(每次修改都自动填充新的 up ...
- mybatis动态调用表名和字段名
以后慢慢启用个人博客:http://www.yuanrengu.com/index.php/mybatis1021.html 一直在使用Mybatis这个ORM框架,都是使用mybatis里的一些常用 ...
- mysql 去除重复 Select中DISTINCT关键字的用法 在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是 distinct只能返回它的目标字段,而无法返回其它字段,这个问题让我困扰了很久,用distinct不能解决的话,
在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记 ...
- [转]MyBatis动态传入表名、字段名参数的解决办法
一直在使用Mybatis这个ORM框架,都是使用mybatis里的一些常用功能.今天在项目开发中有个业务是需要限制各个用户对某些表里的字段查询以及某些字段是否显示,如某张表的某些字段不让用户查询到.这 ...
- 【死磕jeesite源码】mybatis动态调用表名和字段名
本文转载自夏雪冬日 一直在使用Mybatis这个ORM框架,都是使用mybatis里的一些常用功能.今天在项目开发中有个业务是需要限制各个用户对某些表里的字段查询以及某些字段是否显示,如某张表的某些字 ...
- MongoDB查询指定字段(field)返回指定字段的方法
使用MongoDB的时候需要只查询指定的字段进行返回,也就是类似mysql里面的 SELECT id,name,age 这样而不是SELECT *.在MongoDB里面映射(projection)声明 ...
- 判断逻辑 先判断协议字段返回,再判断业务返回,最后判断交易状态 API密钥
[微信支付]微信小程序支付开发者文档 https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=4_1 协议规则 商户接入微信支付, ...
- mybatis&plus系列------Mysql的JSON字段的读取和转换
mybatis&plus系列------Mysql的JSON字段的读取和转换 一. 背景 在平常的开发中,我们可能会有这样的需求: 业务数据在存储的时候,并不是以mysql中的varchar丶 ...
- MongoDB(13)- 查询操作返回指定的字段
插入测试数据 db.inventory.insertMany( [ { item: "journal", status: "A", size: { h: 14, ...
随机推荐
- 脚本,替换ipa里面的资源,并重新打包
今天逯同事说,可以把狂挂传奇打包的项目写成一个脚本,这样就不用担心证书有时不能用的问题了. 然后,像我这么好学的学生,当然要去执行了.(其实,以前他给的建议我都只是听听而已,这次是因为想学点东西了,所 ...
- B-Tree索引和Hash索引的区别
Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-T ...
- 2016年NK冬季训练赛 民间题解
A题 水题,考察对行的读入和处理,注意使用long long #include <iostream> #include <cstring> #include <cstdi ...
- Web实现数据库链接的登录注册修改密码功能
/** * Copyright (C), 2017-2017 * FileName: User * Author: ichimoku * Date: 2017/12/5 14:31 * version ...
- 刷新iframe
<button onclick="document.getElementById('frame').contentWindow.location.reload(true)"& ...
- python的pip安装
http://blog.csdn.net/liuchunming033/article/details/39578019
- POJ1163 The Triangle
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44997 Accepted: 27174 Description 73 ...
- codeforce 570 problem E&& 51Nod-1503-猪和回文
1503 猪和回文 一只猪走进了一个森林.很凑巧的是,这个森林的形状是长方形的,有n行,m列组成.我们把这个长方形的行从上到下标记为1到n,列从左到右标记为1到m.处于第r行第c列的格子用(r,c)表 ...
- 非常好!!!---bash转义序列笔记---打印语句printf用法【转】
转自:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=2318684&fromuid=23571134 本教程由 惟吾无为 ...
- java基础练习 12
public class Twelfth { /*海滩上有一堆桃子,五只猴子来分.第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份.第二只猴子把剩下的桃子又平均分成五 ...