SpringBoot之JPA问题汇总

标签: Springboot 分类: Java 创建时间:2018-12-29 02:16:44 更新时间:2024-11-23 10:24:24

1.jpa插入mysql时中文乱码

(1)在mysql中新建查询 show variables like ‘char%’,看到character_set_server的值为latin1,

(2)修改mysql.ini中

[mysqld]下的

character-set-server=utf8(没有就添加上)

(mysql5.7的ini在C:\ProgramData\MySQL\MySQL Server 5.7目录下,linxu在/etc/mysql/mysql.conf.d/mysql.cnf)
重启mysql

2.jpa查询时不区分大小写

在Mysql数据库中进行查询时,希望英文严格区分大小写。默认情况下是不区分大小写的。

Mysql默认的字符检索策略:utf8_general_ci,表示不区分大小写;utf8_general_cs表示区分大小写,utf8_bin表示二进制比较,同样也区分大小写 。(注意:在Mysql5.6.10版本中,不支持utf8_genral_cs!!!!)

(1) 方式一
创建表时,直接设置表的collate属性为utf8_general_cs或者utf8_bin;如果已经创建表,则直接修改字段的Collation属性(或叫排序规则)为utf8_general_cs或者utf8_bin。

1
2
3
4
5
6
7
CREATE TABLE testt(

id INT PRIMARY KEY,

name VARCHAR(32) NOT NULL

) ENGINE = INNODB COLLATE =utf8_bin;

如果表已经创建,则修改表结构中Collation字段

这时候,再执行上面的两条sql语句,则会严格区分大小写。

(2) 方式二
第二种方式比较简单,是直接修改sql语句,在要查询的字段前面加上binary关键字即可。

1
2
3
SELECT * FROM emp WHERE BINARY emp.job='Engineer'

SELECT * FROM emp WHERE BINARY emp.job='ENGINEER'

3.日期类型的字符串排序,空值在最上面

SELECT * FROM projects ORDER BY LENGTH(trim(pubdate))<1 DESC,pubdate DESC

4.出现错误:The server time zone value ‘Öйú±ê׼ʱ¼ä’ is unrecognized or represents more than one time zone

解决方式是在连接数据库的字符串的后面添加:?serverTimezone=GMT
spring.datasource.url=jdbc:mysql://localhost:3306/xjserver?serverTimezone=GMT

5.Unable to locate Attribute with the the given name [wxOpenid] on this ManagedType

这个问题也可以归结为数据库字段不规范的问题,如果数据库中的字段名是大写字母开头的化,就有可能出现在使用jpa自带的find语句进行查询的时候出现下面的错误。

解决方法有两种:
(1) 实体属性编写时使用规范的驼峰命名,然后使用@Column指明具体的数据库字段名

1
2
@Column(name = "WxOpenid")
private String wxOpenid; // 微信OpenId

(2) 第二种就是使用@Query代替自动生成的find语句

1
2
3
4
5
6
7
8
9
10
11
12
13
public interface WxUserRep extends JpaRepository<WxUser,Long> {
/**
* 根据用户微信id获取用户信息
* @param wxopenid
* @return
*/
@Query("SELECT u FROM WxUser u WHERE u.WxOpenid = ?1")
WxUser findByWxOpenid(String wxopenid);

/*或者是*/
@Query("SELECT u FROM WxUser u WHERE u.WxOpenid = :wxopenid")
WxUser findByWxOpenid(@Param("wxopenid")String wxopenid);
}
参考文章:
1.Spring Jpa报错之Unable to locate Attribute with the the given name [PId] on this ManagedType (这篇文章没有用)
2.SpringBoot Jpa使用时碰到的问题总结二 (这篇文章中建议:一开始设计时,设计字段符合驼峰规则。如果实在无法避免首字母必须大写,那么可以用@query进行查询)
3.Spring Data JPA Unable to locate Attribute with the given name
4.@Query注解的用法(Spring Data JPA)
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。