jpa方法命名规则

关键字 方法命名 sql where字句
And findByNameAndPwd where name= ? and pwd =?
Or findByNameOrSex where name= ? or sex=?
Is,Equals findById,findByIdEquals where id= ?
Between findByIdBetween where id between ? and ?
LessThan findByIdLessThan where id < ?
LessThanEquals findByIdLessThanEquals where id <= ?
GreaterThan findByIdGreaterThan where id > ?
GreaterThanEquals findByIdGreaterThanEquals where id > = ?
After findByIdAfter where id > ?
Before findByIdBefore where id < ?
IsNull findByNameIsNull where name is null
isNotNull,NotNull findByNameNotNull where name is not null
Like findByNameLike where name like ?
NotLike findByNameNotLike where name not like ?
StartingWith findByNameStartingWith where name like '?%'
EndingWith findByNameEndingWith where name like '%?'
Containing findByNameContaining where name like '%?%'
OrderBy findByIdOrderByXDesc where id=? order by x desc
Not findByNameNot where name <> ?
In findByIdIn(Collection c) where id in (?)
NotIn findByIdNotIn(Collection c) where id not  in (?)
TRUE findByAaaTue where aaa = true
FALSE findByAaaFalse where aaa = false
IgnoreCase findByNameIgnoreCase where UPPER(name)=UPPER(?)

常用注解

自动生成时间和修改者

@CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy

在spring jpa中,支持在字段或者方法上进行注解@CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy,从字面意思可以很清楚的了解,这几个注解的用处。

@CreatedDate 表示该字段为创建时间时间字段,在这个实体被insert的时候,会设置值

@CreatedBy 表示该字段为创建人,在这个实体被insert的时候,会设置值

@LastModifiedDate、@LastModifiedBy同理。

自动建表引擎设置

使用SpringDataJpa自动建表默认为MyISAM,而主流大多数场景都需要使用InnoDB,可通过配置文件配置即可

spring:
  jpa:
    database-platform: org.hibernate.dialect.MySQL55Dialect

注意:类名有所变化

早期通过网上搜索的类名都说为org.hibernate.dialect.MySQL5InnoDBDialect,当实际测试时发现引擎依然为MyISAM,通过进一步查询源码发现早期类名已经弃用

/*
 * Hibernate, Relational Persistence for Idiomatic Java
 *
 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
 * See the lgpl.txt file in the root directory or .
 */
package org.hibernate.dialect;

/** A Dialect for MySQL 5 using InnoDB engine
 *
 * @author Gavin King,
 * @author Scott Marlow
 * @deprecated Use "hibernate.dialect.storage_engine=innodb" environment variable or JVM system property instead.
 */
@Deprecated
public class MySQL5InnoDBDialect extends MySQL5Dialect {

	@Override
	protected MySQLStorageEngine getDefaultMySQLStorageEngine() {
		return InnoDBStorageEngine.INSTANCE;
	}
}

但注释里并没有指明新的替代类名,而是建议通过配置实现,但SpringDataJpa自动装配的类里没有支持该配置,故如果不单独引入hibernate依赖是无法使用该配置的

最后在stackoverflow上看到解决方案:where to put hibernate.dialect.storage_engine property

即使用新的类名org.hibernate.dialect.MySQL55Dialect替换即可,尽管两个类名初看没差别,实际上差了一个数字5,影响比较大

MySQL驱动变化

在使用了新版的驱动类后,不管是MyBatis还是Jpa,都会报时区不一致和报错信息乱码的错误需要将连接URL更新

新配置

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 
    url: jdbc:mysql://localhost/pw_manager?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC

原配置

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    username: cmsspringcloud
    password: cmsdbadmin
    url: jdbc:mysql://localhost:3306/cms_springcloud?characterEncoding=utf-8&useSSL=false
最后修改:2020 年 03 月 13 日
如果觉得我的文章对你有用,请随意赞赏