7.HQL连接查询和注解

各种连接查询

连接类型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建立了持久化类之间的多对多关联关系
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值