
根据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)属性是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)