Spring Data Jpa如何新增和更新

Spring Data Jpa如何新增和更新,第1张

根据ID做新增或者update,主键上打@Id。

一 Spring Data Jpa的更新删除:

JPA可以看作标准化的Hibernate。虽然规定了基本的缓存接口,但是具体实现还是要看具体产品。

可以通过Hibernate进行了解。更新删除的时候JPA都需要先维护缓存才可以删除。如果你要直接删除,必须自己写EQL语句。

二  spring data jpa 怎么使用序列:

1  JPA - 简化创建 JPA 数据访问层和跨存储的持久层功能。

2 Hadoop - 基于 Spring 的 Hadoop 作业配置和一个 POJO 编程模型的 MapReduce 作业。

3 Key-Value  - 集成了 Redis 和 Riak ,提供多个常用场景下的简单封装。

4  Document - 集成文档数据库:CouchDB 和 MongoDB 并提供基本的配置映射和资料库支持。

5 Graph - 集成 Neo4j 提供强大的基于 POJO 的编程模型。

6 Graph Roo AddOn - Roo support for Neo4j。

JDBC Extensions - 支持 Oracle RAD、高级队列和高级数据类型

        JPA中使用原生sql查询出的结果中每一条记录是object数组,如下所示

        String sql = "select id,group_name from form_temp_type";

        Query query = entityManagercreateNativeQuery(sql);

        List<Object[]> list = querygetResultList();//最终的结果集是object数组

        我们在使用的时候需要从数组中逐个取出,比较麻烦。很多情况下我们需要的是对象或者Map

       String sql = "select id,group_name from form_temp_type";

        Query query = entityManagercreateNativeQuery(sql);

        queryunwrap(SQLQueryclass)setResultTransformer(TransformersALIAS_TO_ENTITY_MAP);

        List<Map> list = querygetResultList();//这里的结果是Map,我们可以通过字段名称获取到相应的值

public static List findRelatives(Stringsql,Map<String,Object>params,EntityManagerentityManager,Class<>clazz){

        Sessionsession=entityManagerunwrap(Sessionclass);

        NativeQueryquery=sessioncreateNativeQuery(sql);

        queryunwrap(NativeQueryImplclass)setResultTransformer(TransformersaliasToBean(clazz));

        for(Stringkey:paramskeySet()){

                Objectvalue=paramsget(key);

                querysetParameter(key,value);

        }

        entityManagerclose();

        returnquerygetResultList();

}

这是JPA或者hibernate注解生成主键方式中的一种:序列。不过这个要用Oracle数据库才行,好像DB2也有序列这个概念,我说的是在SQLServer、mysql、Oracle这三类数据库中的。一般Oracle用的是序列生成主键。

这个注解SequenceGenerator的意思是:用序列seq_sys_office生成主键,初始化值为200,也就是说第一个生成的主键值为200。在这个注解的源码当中好像默认增长值是50,也就是第二个主键值是250,依次类推。你可以调整它的增长值allocationSize=1

现在想要的需求是在执行 EntityManager 的 persist 方法(即执行SQL 的Insert)时 会自动给 CreateTime和 LastUpdateTime一个当前时间的初始值,以后执行 EntityManager 的 merge 方法(即执行SQL 的update)时,自动给 LastUpdateTime 一个当前时间值,同时忽略 CreateTime 的修改。有没有JPA 的注解可以实现这个需求?因为是用Hibernate40实现的JPA ,所以有没有Hibernate 的注解可以实现这个需求?其实最麻烦的就是 每次merge 的时候忽略 CreateTime字段的更新值,不然每次更新时都要先获取一次数据后塞回给entity,再执行merge,这样效率非常低下啊。

借助于EclipseLink–JPA生成元模型类,首先要下载安装EclipseLink–JPA,安装完成后,可以按照如下步骤使用(请确定你使用的是16及以上版本的JDK):

在eclipse中右键选中要处理的工程,点击Properties,会出现工程属性对话窗口,在菜单列表中选择Java Compiler。

展开Java Compiler选项,并选择Annotation Processing项。

在Annotation Processing窗口中,勾选annotation processing。

在Generated source directory输入框中输入元模型类生成的目录,下面的Processor options一般不需要配置,可以根据自己的特殊需要进行配置。

在左边的菜单中,再展开Annotation Processing选项,选择Factory Path项。

点击右面的Add External JARs,将EclipseLink–JPA注解处理相关jar添加上。

这样差不多就解决了

因为在设计一个树形结构的实体中用到了多对一,一对多的映射关系,在加载其关联对象的时候,为了性能考虑,很自然的想到了懒加载。

比如:@OneToOne(fetch = FetchTypeLAZY, cascade = CascadeTypeALL)

也由此遇到了N+1的典型问题 : 通常1的这方,通过1条SQL查找得到1个对象,而JPA基于Hibernate,fetch策略默认为select(并非联表查询),由于关联的存在 ,又需要将这个对象关联的集合取出,集合数量是N,则要发出N条SQL,于是本来的1条联表查询SQL可解决的问题变成了N+1条SQL

JPA21 支持 通过@EntityGraph及其子类型@NamedEntityGraph来定义获取和负载它们可以被直接在实体类上,用来配置查询结果的获取计划获取的方式(获取/负载)可以通过@EntityGraph的type属性来进行配置

在一个实体类上定义 @NamedEntityGraph(name = "GroupInfodetail",attributeNodes =@NamedAttributeNode("members"))

在repository接口中对需要进行关联查询的方法接口上引用实体类上定义的@NamedEntityGraph

@EntityGraph(value = "GroupInfodetail", type = EntityGraphTypeFETCH)

它也可以通过@EntityGraph注解来直接点对点的指定entity graphs假如依照EntityGraph attributePaths可以被正确的找到,就可以不用在实体类上写@NamedEntityGraph注解了

@EntityGraph(attributePaths ={"certData"})

在项目开发中用到了JPA规范,并在po类中使用了存储过程,这种资料在网上很容易找到,所以很快就跑通了,代码如下:

@Entity

@Table(name = "USER", schema = "MOBILE", uniqueConstraints = {

@UniqueConstraint(columnNames = { "LOGINID" }),

@UniqueConstraint(columnNames = { "USERACCOUNT" }) })

@NamedNativeQuery(name = "addUser", query = "{call addUser(:pPortalID,:ploginid,:ploginpasswd,:pSelfQuiz,:pSelfAnswer,:pUserEmail,:pUserAccount,:pUserPin)}", hints = { @QueryHint(name = "orghibernatecallable", value = "true") }, resultClass = Userclass)

public class User implements javaioSerializable {

private static final long serialVersionUID = 5325039036880950119L;

private String userid;

private String loginid;

private String passwd;

//省略若干代码

}

MAX()/MIN()是指SQL中的最大/最小值函数

因为聚合函数处理的是数据组,在本例中,MAX函数将整个TEACHER表看成一组

而TNAME、DNAME和TSEX的数据都没有进行任何分组,因此SELECT语句没有逻辑意义

MAX()和MIN()函数不仅可以作用于数值型数据,也可以作用于字符串或是日期时间数据类型的数据。

SQL 如下:

实例MAX()函数用于字符型数据

如下面代码:

SELECT MAX (a) AS MAXNAME

FROM A

以上就是关于Spring Data Jpa如何新增和更新全部的内容,包括:Spring Data Jpa如何新增和更新、JPA使用原生sql结果集转换成Map、@SequenceGenerator(name="seq_sys_office",sequenceName="seq_sys_office",initialValue=200)属性是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/9585128.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存