文章目录
两个可用的练习项目:
hibernate jpa练习项目git
spring data : jpa练习项目
一、注解
- @Entity 标注model
- @Table 标注表明,无默认model名
- @UniqueConstraint 标识 唯一组合字段
- @Index 标识 索引
- @Access ,不可再同一个model中混合使用
- @Id 代理键、主键、ID
- @GeneratedValue 主键生成策略
- 支持序列的数据库。@SequenceGenerator标识使用序列生成值,和@GeneratedValue一起使用
- @TableGenerator 使用单独的表作为序列,作用同@SequenceGenerator
- 复合主键@Id和@IdClass 、或者@EmbeddedId和@Embedded
- @Basic 包含:fetch、optional
- @Column 指定对应的数据库列名。insertable、updatable 默认真
- @Temporal 标注日期转换方式。推荐java.time.LocalDate+自定义转换器。避免非必要的时区存储
- @lob 字符串,char[]持久化为clob,其它类型如byte[]、Serializable持久化为Blob
二、spring jpa
1. 基本条件查询
- 模糊查询
@Query("from MyUser u where u.name like CONCAT('%',:name,'%')")
List<MyUser> likeName(@Param("name") String name);
- Is,Equals
@Query("from MyUser u where u.name=:name")
MyUser findMyUser(@Param("name") String name);
@Query("from MyUser u where u.hobbyList is empty")
List<MyUser> NoHobbyUser();
- Between
@Query("from MyUser u where u.age between :min and :max")
public List<MyUser> findAllcs(@Param("min") Integer min,@Param("max") Integer max);
- LessThan
- LessThanEqual
- GreaterThan
- GreaterThanEqual
- After
- Before
- IsNull
- IsNotNull,NotNull
- Like
- NotLike
- StartingWith
- EndingWith
- Containing
- OrderBy
- Not
- In
- NotIn
- IgnoreCase
2、高级查询
- 查询结果创建新对象接收,需存在对应的构造方法
SELECT NEW Employee(e.name, e.salary) ...
- MEMBER OF运算符和NOT MEMBER OF
查找directs中的Professor列表
SELECT e FROM Professor e WHERE e MEMBER OF e.directs
- 查询结果 A对象映射到B对象
TypedQuery<Professor> query = em.createQuery("SELECT e FROM Employee e",
Professor.class);
List<Professor> emps = query.getResultList();
- SIZE函数,查询有2个学生的学校
List l = em.createQuery(
"SELECT d FROM School d WHERE SIZE(d.students) = 2")
.getResultList();
- 多对一,查询部门的员工
List l = em.createQuery("SELECT d.employees FROM Department d")
.getResultList();
三、Hibernate的save、persist、update、merge和saveOrUpdate
推荐用:persist新增, merge更新
四、常见问题集
1、查询的
使用hql有两种方式,其一:
String hql = "select color,font from css";
Query query = session.createQuery(hql);
List<Object[]> links = query.list();
以上方式能直接拿到结果
其二:spring jpa,考虑直接用List<Object> 作为返回结果