SSH进阶(三)Hibernate----关联关系,HQL查询语言

关联关系、HQL语言、关联表之间的查询

 

在mybatis种有关联关系,同样在Hibernate当中也是有关联关系得;

在mybatis当中多对一用的是associatej节点,而一对多对应得就是collection

相应得再hibernate当中多对一是many-to-one 而一对多是one-to-many

一、关联关系

1.首先来说hibernate种多对一得关系

  比如说学生于学校就是一种多对一得关系,与之前mybatis当中得处里方式一样我们只需要做的就是再多得一方得类当中将另一方得对象作为自己得属性;

当然再逆向工程当中,只要你的表当中有对应得主外键那么框架就会自动生成

如图就是再学生对象当中生成了学校得对象最为自己得属性,以关联学校得对象

在具体得配置文件当中得体现就是:

当然关于配置文件在上一篇逆向工程生成之后以及进行了介绍这里就不再赘述;

上面就是多对一得处理方式;

2.接下来就是一对多;

 

首先有了多对一 就会有一对多,一个学校会对应多个学生

具体得体现方式实在生成得实体类当中,学校得实体类当中会有一个关于学生得集合

具体如图:

因为这个属性是集合所以对应配置文件当中得体现形式于多对一是不同的如下图:

Name指的就是集合属性名,而key当中包含得就是学校表当中得主键,而下面得就是关联关系,意思就是我一个sid对应得是你多个ytuser用集合来装载,也即是实体类当中集合当中存储得类型,这样就以对象得方式建立起了关联关系;

 

以上就是两种关联关系及其处理以及体现方式;

 

二、HQL语言

 HQL语言就是hibernate查询语言,它是利用面向对象得思维方式来编写sql语句得;

它操作得表对应得实体类以及属性

用实体类代替表,用属性代替字段;

 

在这里说明得是,查询展位得方式哟两种:

索引占位:即用?占位,,但是设置值得时候式从0开始

命名式展位:用得是:name得方式,在设置得时候相当于用key value得方式赋值;

1、查询:

条件查询直接from pojo where pojo得属性,不用写select

再如这个左外连接:from Uschool u left join fetch u.ytusersBySId"

查询与其他几个不一样的是,它是哟返回值的,所以要用集合去接受,

值得注意的是,若要是在一对多一的一方查询多的一方得到相应的集合,则应该去改类下将集合属性初始化,否则会出错具体如下图:

因为在配置文件当中设置的是set集合所以这儿初始化的时候,初始化set集合;

下面是一个模糊查询

String hql = "from BookInfo where bookName like :name";

用定义好的sql加上返回值集合种类型的类=类对象,来创建查询

        Query<BookInfo> query = session.createQuery(hql, BookInfo.class);

设置模糊查询的值

        query.setParameter("name","%物理%");

这儿于增删改不一样的就是,它是直接得到结果集,相当于执行查询只是方式不一样而已

当然如果的你返回值是单个的是,则使用uniqueResult这个方法;

        List<BookInfo> resultList = query.getResultList();

之后对得到的集合遍历即可;

        for (BookInfo bookInfo : resultList) {

            System.out.println(bookInfo.getBookName()+"\t"+bookInfo.getBookAuthor());

        }

查询部分字段的值

public void  findAll(){

    Session currentSession = HibernateUtils.getCurrentSession();

    Transaction transaction = currentSession.beginTransaction();

查询的是id和name

    String hql="select S.sId,S.sName from Uschool S";

    Query<Object[]> query = currentSession.createQuery(hql,Object[].class);

    List<Object[]> resultList = query.getResultList();

    for (Object[] objects : resultList) {

        System.out.println(objects[0]+"///"+objects[1]);

    }

    transaction.commit();

}

 

2、更新

根据id更新name: update Uschool set sName= :name where sId= :id

 

首先定义一条hql语句

String  hql="update Uschool set sName= :name where sId= :id";
利用session来创建查询,关于session得获方式会在另外一篇博文当中提到:

Query query = currentSession.createQuery(hql);
 
然后根据创建得对象来设置值,和requrst有点类似,哈哈;

query.setParameter("name","厦门大学");

query.setParameter("id",5L);
 
然后再用这个对象去指执行创建得更新;

int i = query.executeUpdate();

 

 

3、删除

 

根据id删除:delete from Uschool where sId= :id

 

 

于更新是一样得操作就不再赘述;

String hql="delete from Uschool where sId= :id";

Query query = currentSession.createQuery(hql);

query.setParameter("id",6L);

query.executeUpdate();



4、增加

 

增加要做的就是,先得到这个类的对象,然后为这个对象set值,然后session.save(pojo);即可,比较简单,这里就不追代码了;

 

 

三、接下来我们要介绍的就是关联查询:

 

1、//多对一的方式,获取关联的一个对象

public BookInfo getBookAndType2(){

解释一下这里是通过session的一个工具类类得到session,具体参考另外一篇博文

Session session = HibernateUtils.openSession();

更具类对象以及主键id获取到某一个对象

BookInfo bookAndType = session.get(BookInfo.class, 32L);

打印改对象的属性值

System.out.println(bookAndType.getBookName()+"\t"+bookAndType.getBookPrice());

根据获得的这个对象的属性值,获取关联对象

 BookType bookTypeByTypeId = bookAndType.getBookTypeByTypeId();//得到分类对象

打印关联对象的属性 

System.out.println(bookTypeByTypeId.getTypeId()+"\t"+bookTypeByTypeId.getTypeName()+"\t"+bookTypeByTypeId.getTypeDesc());

        session.close();//关闭 session

        return  bookAndType;

}

 

 

 

2、//添加,多对一,关联的对象

    public void addBook(){

        Session session = HibernateUtils.openSession();

        Transaction transaction = session.beginTransaction();

创建一个新的对象

        BookInfo pojo = new BookInfo();

为对象设置属性值

        pojo.setBookAuthor("Java1803");

        pojo.setBookDate(new Date().getTime());

        pojo.setBookDesc("好好学习");

        pojo.setBookName("天天向上");

更具id找到关联对象,并设置为属性值

        pojo.setBookTypeByTypeId(byId);//关联字段是关联的对象

将此对象保存

        session.save(pojo);

提交事务

        transaction.commit();

        session.close();

    }

 

 

 

3、从Uschool的角度获取包含Ytuser对象的属性集合

(1)String hql="from Uschool u left join fetch u.ytusersBySId";
此处使用Object[]数组作为集合当中的类型
注:此处不能用具体的对象,因为左外连接获取的是两个表即两个对象,所以单个的对象是接受不了的,经过小编的调试的知此处返回的是Object集合,
如果你是一Uschool为主表进行外连接,此处的object[0]就是Uschool对象,object[1]是从表Ytuser对象;
若是一Ytuser为主表则Object[0]就是Ytuser,相应的ojbject[1]就是Uschool对象
Query<Object[]> query = currentSession.createQuery(hql, Object[].class);
得到object返回集合

List<Object[]> resultList = query.getResultList();

for (Object[] objects : resultList) {
得到学校对象且打印它的属性

    Uschool ytuser = (Uschool)objects[0];

    System.out.println(ytuser.getsId()+"---"+ytuser.getsName());
得到学生对象并且打印它的属性

    Ytuser ytuser1=(Ytuser)objects[1];

    System.out.println(ytuser1.getUsername()+"--"+ytuser1.getBirthday());

}
 
(2)还有一种方法,下凹便推荐使用后者这样不论是代码量还是,程序的复杂度上来说都是由优于前者的;
此种方法就是利用一个关键字:fetch
用了这个关键字之后,我们可以直接用Uschool类接收返回值
定义hql语句
String hql="from Uschool u left join fetch u.ytusersBySId";
创建查询

Query<Uschool> query = currentSession.createQuery(hql, Uschool.class);
得到结果集

List<Uschool> resultList = query.getResultList();

for (Uschool uschool : resultList) {
打印Uschool的属性值

    System.out.println(uschool.getsName()+"//"+uschool.getsId());

    根据关联的集合属性 获取Ytuser的集合更加的简单;
Collection<Ytuser> ytusersBySId = uschool.getYtusersBySId();
遍历这个集合

    for (Ytuser ytuser : ytusersBySId) {

        System.out.println(ytuser.getUsername()+"=="+ytuser.getPassword());

    }

}
以上就是集团的内容,下一篇博文,将会为大家介绍检索方式以及pojo的状态及其缓存机制,敬请关注;谢谢阅读;
版权声明:本文为博主原创文章,未经博主允许不得转载 https://blog.csdn.net/qq_42112846

 

猜你喜欢

转载自blog.csdn.net/qq_42112846/article/details/81088572