Maven依赖
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>1.11.7.RELEASE</version> </dependency>
引入后自动依赖jar包
使用
配置xml
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="org.logicalcobwebs.proxool.ProxoolDriver"/> <property name="url" value="proxool.asset"/> </bean> <!-- spring整合JPA --> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource" /> <!--指定JPA扫描的实体类所在的包--> <property name="packagesToScan" value="com.gmtx" /> <!-- 指定持久层提供者为Hibernate --> <property name="persistenceProvider"> <bean class="org.hibernate.ejb.HibernatePersistence" /> </property> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <!-- 自动建表 --> <property name="generateDdl" value="true" /> <property name="database" value="MYSQL" /> <property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect" /> <property name="showSql" value="true" /> </bean> </property> <property name="jpaDialect"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" /> </property> </bean> <!-- JPA事务管理器 --> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> <!-- 配置jpa的factory和,扫描repository接口transaction,自动生成实现类 --> <jpa:repositories base-package="com.gmtx" entity-manager-factory-ref="entityManagerFactory" transaction-manager-ref="transactionManager" />
使用
Spring Data JPA的独特之处就是简单查询根本不用写实现类,直接写接口就好,它能根据你的接口去生成sql.
find+全局修饰+By+实体属性名称+限定词+连接词+(其他实体属性)+OrderBy+排序属性+排序方向.
@Query查询
前面使用的@Query注解来进行的都是查询操作,如果要进行数据更新,那么需要结合注解@Modifying来一起使用,注:不支持插入操作。
参数使用
带参查询
- 1、根据参数位置,使用?paramIndex
- 2、根据@Param注解,使用:param
- 3、@Param注解实体时,@Query中需要使用Spel表达式 :#{#paramVal.att}},paramVal为注解的value,att为实体的属性。
为空参数过滤
使用 :参数 每个参数都需要
@Param()
否则报错
if(:ids != '',id <> :ids,1=1)
jpa 中判断是否为空 不是 != null 而是 != '' ,1=1 则让程序继续执行下去。
@nativeQuery参数
@Query有nativeQuery=true,表示可执行的原生sql,原生sql指可以直接复制sql语句给参数赋值就能运行,nativeQuery=false, 表示不是原生sql,查询语句中的表名则是对应的项目中实体类的类名。
参数为空过滤+模糊查询
import com.gmtx.repair.entity.Repair_order; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import java.util.List; public interface RepOrderRepository extends JpaRepository<Repair_order,String>{ @Query(value = "select * from repair_order where " + "if(:devcode != '',devcode like CONCAT('%',:devcode,'%'),1=1) and " + "if(:devname != '',devname like CONCAT('%',:devname,'%'),1=1) and " + "if(:devmodel != '',devmodel like CONCAT('%',:devmodel,'%'),1=1) " + "order by emergency desc",nativeQuery = true) List<Repair_order> findByDevcodeAndDevnameAndDevmodel(@Param("devcode") String devcode, @Param("devname") String devname, @Param("devmodel") String devmodel); }
Spel表达式访问对象参数
@Query(value = "update repair_order set devcode=:#{#rep.devcode},devname=:#{#rep.devname}, devmodel=:#{#rep.devmodel}, address=:#{#rep.address} where orderid=:#{#rep.orderid}}",nativeQuery = true) @Modifying @Transactional void update(@Param("rep") Repair_order rep);
批量删除
@Query(value = "delete from repair_order where devcode in :devcodes",nativeQuery = true) @Modifying @Transactional void deleteByDevcodeIn(@Param("devcodes") List devcodes);
报错
Lorg/springframework/core/env/Environment
java.lang.NoSuchMethodError: org.springframework.beans.factory.xml.XmlReaderContext.getEnvironment()Lorg/springframework/core/env/Environment;
spring版本过低导致,最少需要4.2.5
报错的这个类存在于spring-beans中
java.sql.SQLException: Can not issue data manipulation statements with executeQuery()
Repository接口上要加@Modifying注解。
javax.persistence.TransactionRequiredException: Executing an update/delete query
Repository接口上要加@Transactional注解。
org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save()
id为int并且自增的情况下,在Model表中@Id字段添加@GeneratedValue(strategy = GenerationType.IDENTITY)
Encountered a duplicated sql alias [] during auto-discovery of a native-sql query
查看配置文件中<property name="generateDdl" value="true" />有没有这个配置,会自动给表添加字段。或者查看sql有没有重复的别名。