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

  • 相关阅读:
    (转)怎样获得与激活Windows 7超级管理员权限
    (转) C代码优化方案
    英语词汇立体记忆 02
    (转)LUA和C之间的函数调用
    通过lua自带例子学习lua 01
    英语词汇立体记忆 01
    反射(类加载内存分析)
    反射(类加载器的作用)
    反射(动态创建对象操作属性)
    反射(分析类初始化)
  • 原文地址:https://www.cnblogs.com/aeolian/p/12666632.html
Copyright © 2020-2023  润新知