Spring Data Jpa

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有没有重复的别名。

原文地址:https://www.cnblogs.com/aeolian/p/12666632.html