hibernate不同条件查询结果集一样,主键@ID的原因
这一周在翻新公司的老项目,遇到了一些预想不到的事情。
其中一个是,使用hibernate查询,不同的查询条件,居然都查到同一条记录,感觉奇怪了,开始以为是session的原因;
后来发现是hibernate对主键有要求,看了数据库表设计,惨了,居然没有主键,我丢,好多表都没有主键,当时内心是郁闷的,什么人设计的?后来想想,这都十年前的项目了,十年前这个设计水平,也理解吧。
hibernate在数据表所对应的实体类有要求:必须有主键。因为数据表没有主键,于是最初我给其中一个非空字段标记为@Id,后来惨了,因为条件查询只要条件里有这个字段,查出来的都是这条数据。
解决方法:
构建联合主键:
将原来的实体类A分解为两个类:主键类A1 和 实体类A2
主键类A1:将联合主键的字段单独放在类中,该类实现 java.io.Serializable 接口,并重写 equals 和 hascode,再将该类注解为 @Embeddable
@Data
@Embeddable
public class BankParamKey implements Serializable { private String pmcd;
private String pmtp;
private String pmnm; @Override
public boolean equals(Object obj) {
return super.equals(obj);
} @Override
public int hashCode() {
return super.hashCode();
}
}
实体类A2:该类不包含联合主键类中的字段,但保存联合主键类的引用,并生成 set 和 get 方法(此处用lombok自动生成),并将该引用注解为 @Id
@Data
@Entity
@Table(name ="P019")
public class BankParam implements Serializable { @Id
private BankParamKey bankParamKey;//pmcd + pmtp + pmnm 组合主键
private String pmky;
private String pmv4;
private String pmv1;
private String pmv5;
private String pmv2;
private String pmv3;
}
这样就可用解决使用hibernate但是没有主键的表的问题了。
hibernate不同条件查询结果集一样,主键@ID的原因的更多相关文章
- Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射
Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射 Hibernate提供了两 ...
- MySQL select if 查询最后一个主键 id
查询最后一个主键id SELECT IF(MAX(id) IS NULL, 0, MAX(id)) AS maxid FROM users; 查询最小的主键id SELECT IF(MIN(id) I ...
- Hibernate save或者persist 后获取主键ID
一个自增长ID的对象被save或者persist后,会返回其主键ID: Department department = new Department(); department.setName(&qu ...
- sql insert、update、delete完以后返回主键ID
以前只用过在insert完以后利用select @@IDENTITY返回主键ID,最近在做微信公众平台,遇到一个需求是在帮绑定万微信openid后自动完成登陆,这就需要update以后返回主键ID,查 ...
- MySQL ORDER BY主键id加LIMIT限制走错索引
背景及现象 report_product_sales_data表数据量2800万: 经测试,在当前数据量情况下,order by主键id,limit最大到49的时候可以用到索引report_produ ...
- 分布式系统中我们会对一些数据量大的业务进行分拆,分布式系统中唯一主键ID的生成问题
分布式全局唯一ID生成策略 https://www.cnblogs.com/vandusty/p/11462585.html 一.背景 分布式系统中我们会对一些数据量大的业务进行分拆,如:用户表,订 ...
- 开启事务时mybatis返回主键id
先说一下没有注解的 先给出实体类: public class City { private int city_id; private String city_name; public int getC ...
- MyBatis+MySQL 返回插入的主键ID
需求:使用MyBatis往MySQL数据库中插入一条记录后,需要返回该条记录的自增主键值. 方法:在mapper中指定keyProperty属性,示例如下: <insert id="i ...
- Oracle通过主键id删除记录很慢
问题描述: Oracle通过主键id删除2000条记录很慢,需要花费十二分钟. 解决过程: 1.首先查看SQL的执行计划,执行计划正常,cost只有4,用到了主键索引. 2.查看等待事件, selec ...
随机推荐
- TDSQL MySQL版基本原理-水平分表 读写分离 弹性扩展 强同步
TDSQL MySQL版(TDSQL for MySQL)是部署在腾讯云上的一种支持自动水平拆分.Shared Nothing 架构的分布式数据库.TDSQL MySQL版 即业务获取的是完整的逻辑库 ...
- 在Raspberry Pi 3B+上安装Windows 10 IoT
下载 进入树莓派下载页面,当前网址https://www.raspberrypi.org/downloads/ 选择Windows 10 IoT Core,当前网址https://docs.micro ...
- adb 常用命令大全(4)- 应用管理
查看应用列表 语法格式 adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER] ...
- inet_aton和inet_ntoa
3.1 inet_aton() int inet_aton(const char *cp, struct in_addr *inp); 参数说明: cp : IPv4点分十进制字符串,例如" ...
- WinForm控件常用设置(转)
本来想自己整理一份,但找到了一份挺全的,就直接用到直接找吧 A0 ---- 通用A1 ---- Form 类A2 ---- Control 类A3 ---- MessageBox 类A4 ---- B ...
- 获取input对应的的选项
需求是把所有题目中的选项ABCDEF等对应保存到后台, 这个问卷中有多选项和单选项 var data = {}; $(".u-box .u-item").each(function ...
- HTTP快速入门
一.tomcat端口号设置为80,访问时候可以不加:http协议1.1版本可以复用连接,请求结束后会稍微等会: 二. 表单,get方式提交: 三.user-agent告诉服务器是哪个浏览器,代码中解决 ...
- java版gRPC实战之二:服务发布和调用
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- JS获取DOM元素的八种方法
JS获取DOM元素的方法(8种) 通过ID获取(getElementById) 通过name属性(getElementsByName) 通过标签名(getElementsByTagName) 通过类名 ...
- 如何在云效流水线 Flow中构建属于自己的NPM仓库
如何在云效流水线 Flow中构建属于自己的NPM仓库,Flow 通过各种构建组件,对各种语言提供了制品打包能力,让用户可以快速的使用流水线构建制品,并通过后续的部署任务进行部署.Flow 已经完成了与 ...