package test;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import domain.Customer;
import utils.HibernateUtils;
public class Demo4 {
/*
* 使用HQL显示内连接
* 注意语句中使用的都是对象的名字不是表名
* HQL的多表查询有 迫切与非迫切之分,可以参考以下代码,一般都用迫切因为可以将数据封装到bean中,
*非迫切则只是Object[]数组
* mysql多表查询的定义参考,图文并茂很详细有时间可以仔细看看链接如下
* https://www.cnblogs.com/bypp/p/8618382.html
*/
@Test
public void run3() {
/*
* 左外链接迫切返回结果,返回类型为HQL中的类型
* 使用方法是将inner关键字替换为left
*/
//获得session
Session session = HibernateUtils.getCurrentSession();
Transaction tr = session.beginTransaction();
String hql = "from Customer c left join fetch c.linkmans";
List<Customer> list = session.createQuery(hql).list();
Set<Customer> set = new HashSet<>(list);
for (Customer customer : set) {
System.out.println(customer);
}
tr.commit();
}
@Test
public void run2() {
/*
* 内连接迫切返回结果,返回类型为HQL中的类型
* 使用方法是在join 关键字后面加上fetch
* 排重可以用hashset的构造函数传入list即可。
*/
//获得session
Session session = HibernateUtils.getCurrentSession();
Transaction tr = session.beginTransaction();
String hql = "from Customer c inner join fetch c.linkmans";
List<Customer> list = session.createQuery(hql).list();
Set<Customer> set = new HashSet<>(list);
for (Customer customer : set) {
System.out.println(customer);
}
tr.commit();
}
@Test
public void run1() {
/*
* 内连接非迫切返回结果,返回类型为Object[]
*/
//获得session
Session session = HibernateUtils.getCurrentSession();
Transaction tr = session.beginTransaction();
String hql = "from Customer c inner join c.linkmans";
List<Object[]> list = session.createQuery(hql).list();
// Set<Object[]> set = new HashSet<>(list);
for (Object[] object : list) {
System.out.println(Arrays.toString(object));
}
tr.commit();
}
}