各种连接查询
连接类型 | HQL语法 |
---|---|
内连接 | inner join或join |
迫切内连接 | inner join fetch或join fetch |
左外连接 | left outer join或left join |
迫切左外连接 | left outer join fetch或left join fetch |
右外连接 | right outer join 或right join |
内连接
语法:
from Entity [inner] join [fetch] Entity.property
具体实现:
List<Object[]> list = HibernateUtil.currentSession()
.createQuery("from Dept d inner join d.emps").list();
for (Object[] obj : list) {
System.out
.println(obj[0] +"\t"+obj[1]);
}
注:要用Object[]数组接收
迫切内连接
具体实现:
List<Dept> list = HibernateUtil.currentSession()
.createQuery("from Dept d inner join fetch d.emps").list();
for (Dept dept : list) {
System.out
.println(dept.getDeptName() + "\n\t" + dept.getEmps());
}
注:使用fetch关键字实现了将Emp对象读出来后立即填充到对应的dept对象的集合属性中,所以就可以拿dept集合接收
外连接
左外连接
语法:
from Entity left [outer] join [fetch] Entity.property
右外连接
语法:
from Entity right[outer] join Entity.property
注:fetch关键字只对inner join和left outer join有效。对于right outer join 而言,由于作为关联对象容器的“左边”对象可能为null,所以也就无法通风fetch关键字强制Hibernate进行填充操作
等值连接
语法
from Dept d,Emp e where d=e.dept
隐式内连接
List<Emp> list =
HibernateUtil.currentSession()
.createQuery("from Emp e where e.dept.deptName=?") .setString(0,
"研发部").list();
for (Emp emp : list) { System.out.println(emp.geteName()); }
聚合函数
count() 统计记录条数
sum() 求和
min() 最小值
max() 最大值
avg() 平均值
选取多个对象,用uniqueResult()方法返回一个Object数组
子查询
关键字 | 说明 |
---|---|
all | 子查询语句返回的所有记录 |
any | 子查询语句返回的任意一条记录 |
some | 与"any"意思相同 |
in | 与"=any"意思相同 |
exists | 子查询语句至少返回一条数据 |
操作集合的函数或属性
函数或属性 | 说明 |
---|---|
size()或size | 获取集合中元素的数目 |
minIndex()或minIndex | 对于建立了索引的集合,获得最小的索引 |
maxIndex()或maxIndex | 对于建立了索引的集合,获得最大的索引 |
minElement()或minElement | 对于包含基本类型的集合,获得集合中取值最小的元素 |
maxElement()或maxElement | 对于包含基本类型元素的集合,获得集合中取值最大的元素 |
elements | 获取集合中所有元素 |
注解
注解 | 含义和作用 |
---|---|
@Entity | 将一个类声明为一个持久化类· |
@Table | 为持久化类映射指定表(table),目录(catalog)和schema的名称。默认,持久化类名,不带参数 |
@id | 声明了持久化类的标识属性(相当于数据表的主键) |
@GeneratedValue | 定义标识属性值得生成策略 |
@UniqueConsttraint | 定义表的唯一约束 |
@Lob | 表示属性被持久化为Blob或者Clob类型 |
@Column | 将属性映射到数据库字段 |
@Transient | 指定可以忽略的属性,不用持久化到数据库 |
@Entity
@Table(name = "`STREET`")
public class Street {
@Id
private Integer streetId;
@Column(name = "`NAME`")
private String name;
@Column(name = "`DISTRICT_ID`")
private Integer districtId;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "`STREET_ID`")
private District district;
// 查询所有50条以上房屋信息
@OneToMany(mappedBy = "street", cascade = { CascadeType.ALL })
private Set<House> houses = new HashSet<House>();
}
@GenerateValue指定了主键的生成策略,不使用次注解,默认由程序赋值(相当在映射文件中指定assigned),JPA提供了四种标准用法
(1)AUTO:根据不同的数据库选择不同的策略(相当于Hibernate中的native)
(2)TABLE:保存id值
(3)IDENTIEY:使用数据库自动生成主键值(主要是自动增长型,如Mysql,Sql server)
(4)SEQUENCE:使用序列生成主键值(如oracle),generator=“seq_emp”指定生成器seq_emp
@SequenceGenerator设置了序列生成器,name=“seq_emp”定义了序列生成器的名称为seq_emp,sequenceName="seq_emp_id"指定了序列的名称为seq_emp_id,initialValue设置了主键起始值;allocationsize设置了生成分配器分配id的增量
注解配置关联关系
注解 | 含义和作用 |
---|---|
@OneToOne | 建立了持久化类一对一关联关系 |
@OneToMany | 建立了持久化类之间的一对多关联关系 |
@ManyToOne | 建立持久化类之间的多对一的关联关系 |
@ManyToMany | 建立了持久化类之间的多对多关联关系 |