JPA简单使用

Java中部分注解简介

@MappedSuperclass :实体类继承映射超类
抽象类或具体的类都可以作为映射超类,使用@MappedSuperclass注解来指定映射超类

package com.mikan;
 
import java.io.Serializable;
 
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
 
@MappedSuperclass
public class Employee implements Serializable {
 
    private static final long serialVersionUID = -7674269980281525370L;
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected Integer empId;
    
    @Column
    protected String name;
 
    // getter/setter方法
    
}
 
package com.mikan;
 
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
 
@Entity
@Table(name = "FT_EMP")
public class FullTimeEmployee extends Employee {
 
    private static final long serialVersionUID = 9115429216382631425L;
 
    // 继承映射超类的empId和name属性
 
    @Column
    private Double salary;
 
    // getter/setter方法
    
}
 
package com.mikan;
 
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
 
@Entity
@Table(name = "PT_EMP")
public class PartTimeEmployee extends Employee {
 
    private static final long serialVersionUID = -6122347374515830424L;
 
    // 继承映射超类的empId和name属性
 
    @Column(name = "hourly_wage")
    private Float hourlyWage;
 
    // getter/setter方法
    
}

映射超类能够像实体类一样被映射,只是它的映射将作用于继承自它的实体类,因为它本身不存在单独的表。当作用于子类时,继承的映射信息将作用于子类对应的表上。
参考https://blog.csdn.net/mhmyqn/article/details/37994707

@Data: lombok代替setter getter等方法
@Entity :指出该Java类为实体类,将映射到指定的数据库
@Transient :忽略该属性,不需要映射到数据表的一列,否则默认为@Basic
@Temporal :在属性上调整精度,比如Date
@Table :标注常用name属性,用于指定数据库的表明
@Id :映射主键(放在getter方法之前)
@GeneratedValue :用于标注主键的生成策略,通过strategy属性指定
@Column :映射数据表的列名,指定unique,length等
@Basic :基本注解,默认有

单向多对一:使用@ManyToOne来映射多对一关系映射;使用@JoinColumn来映射外键;建议先保存1的一端,后保存n的一端;可以使用@ManyToOne的fetch来修改默 认的关联属性的加载策略
单向一对多:使用@OneToMany来映射一对多关系映射;使用@JoinColumn来映射外键;
双向一对一:使用@OneToOne来映射一对一对应关系映射;建议先保存不维护关联关系的一方,既没有外键的一方,
双向多对多:使用@ManyToMany来映射多对多关系映射;使用@JoinTable来映射中间表;name:指定外键的列名;rederenedColumnName:指定外键列关联的当期表 的那一列;inverseJoinColumns:映射关联的类所在中间表的外键

JPA简单用法
建一个接口继承org.springframework.data.jpa.repository.JpaRepository
示例:

public interface AdvertisementDao extends JpaRepository<Advertisement, Long> {
}

jpa默认查询方法

1.findOne(id):查询指定id的数据
2.List<T> findAll():查询对应实体的所有数据
3.List<T> findAll(Sort sort):带排序的查询
Sort(Direction.DESC,String properties),Direction指定排序方式,properties指 定排序的字段;Sort(Direction direction, List<String> properties)
1.T save(entity):新增数据/更新数据
2.Page<T> findAll(Pageable pageable):带分页的查询
PageRequest(int page, int size),page代表页码,size代表每页显示的条数
PageRequest(int page, int size, Sort sort)
1.T save(list):批量新增
2.void flush:将所有挂起的更改同步到数据库
3.T saveAndFlush(entity):更新数据
4.void delete(id):删除指定id数据
5.void delete(entity):删除数据
6.void delete(list):删除list集合
7.void deleteAll:删除所有数据
8.exists(id):是否存在指定id的数据
9.count():统计数据数目

jpa自定义简单查询

关键字 示例 原生sql
And findByLastnameAndFirstname …where x.lastname=?1 and x.firstname = ?2
Or findByLastnameOrFirstname …where x.lastname = ?1 or x.firstname = ?2
Is, Equals findByFirstnameIs,findByFirstnameEquals …where x.firstname = ?1
Between findByStartDateBetween …where x.startDate between ?1 and ?2
LessThan findByAgeLessThan …where x.age < ?1
LessThanEqual findByAgeLessThanEqual …where x.age ⇐ ?1
GreaterThan findByAgeGreaterThan …where x.age > ?1
GreaterThanEqual findByAgeGreaterThanEqual ..where x.age >= ?1
After findByStartDateAfter ..where x.startDate > ?1
Before findByStartDateBefore …where x.startDate < ?1
IsNull findByAgeIsNull …where x.age is null
IsNotNull,NotNull findByAge(Is)NotNull …where x.age not null
Like findByFirstnameLike …where x.firstname like ?1
NotLike findByFirstnameNotLike ..where x.firstname not like ?1
StartingWith findByFirstnameStartingWith ..where x.firstname like ?1 (parameter bound with appended %)
EndingWith findByFirstnameEndingWith ..where x.firstname like ?1 (parameter bound with prepended %)
Containing findByFirstnameContaining ..where x.firstname like ?1 (parameter bound wrapped in %)
OrderBy findByAgeOrderByLastnameDesc …where x.age = ?1 order by x.lastname desc
Not findByLastnameNot ..where x.lastname <> ?1
In findByAgeIn(Collection ages) …where x.age in ?1
NotIn findByAgeNotIn(Collection age) …where x.age not in ?1
TRUE findByActiveTrue …where x.active = true
FALSE findByActiveFalse …where x.active = false
IgnoreCase findByFirstnameIgnoreCase …where UPPER(x.firstame) = UPPER(?1)

自定义SQL查询
在SQL的查询方法上面使用@Query注解,如涉及到删除和修改在需要加上@Modifying.也可以根据需要添加 @Transactional 对事务的支持

public interface TopicInviteeDao extends JpaRepository<TopicInvitee, Long> {
    @Query(nativeQuery = true, value = "SELECT * FROM t_topic_invitee WHERE t_topic_invitee.topic_id =?1 AND  t_topic_invitee.user_id =?2")
    TopicInvitee findByTopicIdAndUserId(Long topicId, Long userId);
    @Query(nativeQuery = true, value = "SELECT * FROM t_topic_invitee WHERE t_topic_invitee.topic_id =?1 ")
    List<TopicInvitee> findByTopicId(Long topicId);

    List<TopicInvitee> findByUserId(Long userId);

    @Query(nativeQuery = true, value = "SELECT * FROM t_topic_invitee WHERE t_topic_invitee.user_id =?1 ")
    List<TopicInvitee> findAllByUserId(Long userId);
    @Transactional
    @Modifying
    @Query(nativeQuery = true, value = "DELETE FROM  t_topic_invitee WHERE  t_topic_invitee.topic_id =?1 ")
    int deleteByTopic(Long topicId);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355

推荐阅读更多精彩内容