hql连表查询(多表查询)

本文主要探讨了HQL在进行连表查询时遇到的问题,通过实例进行了总结,旨在为读者提供有关HQL连表查询的实用知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hql连表查询的问题,总结了一下,与大家分享

 

package android.com.bzjm.test;


import java.util.List;

import org.hibernate.HibernateException;

import org.hibernate.Query;

import org.hibernate.Session;

import org.hibernate.Transaction;


import com.bzjm.pojo.Ktvinfo;

import com.bzjm.pojo.Ktvtype;


import android.com.bzjm.pojo.HibernateSessionFactory;


/**

 * @author Adayan 2016年2月21日下午5:15:53

 */

public class Hqltext {


    public void jiaocha() {// 交叉查询

        // 同时查询出多表的数据


        Session session = null;

        try {

            session = HibernateSessionFactory.getSession();

            Transaction ts = session.beginTransaction();

            Query query = session.createQuery("from Ktvinfo,Ktvtype");


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


            // 将获取到的2个表,分开获取


            for (Object[] values : list) {

                Ktvinfo ktvinfo = (Ktvinfo) values[0];

                System.out.println(ktvinfo.getId() + ktvinfo.getKinformation());

                Ktvtype type = (Ktvtype) values[1];

                System.out.println(type.getKroomInfo() + type.getKleftNum());

            }

        } catch (HibernateException e) {

            e.printStackTrace();

            session.getTransaction().rollback();

        } finally {

            HibernateSessionFactory.closeSession();

        }


    }


    public void neilianjie() {// 内连接查询(用于有外键的情况)


        // 下面三种(用于有外键的情况)hql语句都是可以得到相同的结果

        // 1.String hql="select p from Ktvtype as p inner join p.ktvinfo";

        // 在下面的hql语句中加入"fetch"后,此hql语句变为了"迫切HQL"语句,这样的查询效率要比上面的hql语句要高

        // String hql="select p from Ktvtype as p inner join fetch p.ktvinfo";


        // 2.String hql="select p from Ktvtype p,Ktvinfo k where p.ktvinfo=k";

        // 3.String

        // hql="select p from Ktvtype p,Ktvinfo k where p.ktvinfo.id=k.id";


        // 没有外键的情况: String hql="from Ktvtype p,Ktvinfo k where p.id=k.id";


        Session session = null;

        try {

            session = HibernateSessionFactory.getSession();

            Transaction ts = session.beginTransaction();

            // 用于有外键的时候

            String hql = "select p from Ktvtype as p inner join fetch p.ktvinfo";

            Query query = session.createQuery(hql);


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


            // 将获取到的2个表,分开获取


            for (Object[] values : list) {

                Ktvinfo ktvinfo = (Ktvinfo) values[0];

                System.out.println(ktvinfo.getId() + ktvinfo.getKinformation());

                Ktvtype type = (Ktvtype) values[1];

                System.out.println(type.getKroomInfo() + type.getKleftNum());

            }

        } catch (HibernateException e) {

            e.printStackTrace();

            session.getTransaction().rollback();

        } finally {

            HibernateSessionFactory.closeSession();

        }

    }


    public void zuowailianjie() {// 左外连接(left outer join)


        // String

// hql="select p from Ktvtype p left outer join p.ktvinfo order by p.ktvinfo.id";

        // 在下面的hql语句中加入"fetch"后,此hql语句变为了"迫切HQL"语句,

        //这样的查询效率要比上面的hql语句要高

        // String

      //hql="select p from Ktvtype p left outer join fetch p.ktvinfo order by p.ktvinfo.id";


        // String hqlk="select k from Ktvinfo k left outer join k.ktvtype";

        // 在下面的hql语句中加入"fetch"后,此hql语句变为了"迫切HQL"语句,

        //这样的查询效率要比上面 的hql语句要高

        // String hqlk="select k from Ktvinfo k left outer join fetch k.ktvtype";


        Session session = null;

        try {

            session = HibernateSessionFactory.getSession();

            Transaction ts = session.beginTransaction();

            String hql = "select p from Ktvtype p left outer join fetch p.ktvinfo order by p.ktvinfo.id";

            Query query = session.createQuery(hql);


            List<Ktvtype> list = query.list();

            for (Ktvtype p : list) {

                System.out.println(p.getKroomInfo() + p.getKleftNum());

            }


            System.out.println("+++++++++++++++++++++++++++++++++++++++");

            String hqlk = "select k from Ktvinfo k left outer join fetch k.ktvtype";

            query = session.createQuery(hqlk);


            List<Ktvinfo> listk = query.list();

            for (Ktvinfo k : listk) {

                System.out.println(k.getKinformation() + k.getKlocaltion());

            }


        } catch (HibernateException e) {

            e.printStackTrace();

            session.getTransaction().rollback();

        } finally {

            HibernateSessionFactory.closeSession();

        }


    }


    public void youwailianjie() {// 右外连接(right outer join)

        Session session = null;

        try {

            session = HibernateSessionFactory.getSession();

            Transaction ts = session.beginTransaction();

            String hql = "select k from Ktvinfo k right outer join k.ktvtype order by k.id";

            Query query = session.createQuery(hql);


            List<Ktvinfo> listk = query.list();

            for (Ktvinfo k : listk) {

                System.out.println(k.getKinformation() + k.getKlocaltion());

            }

        } catch (HibernateException e) {

            e.printStackTrace();

            session.getTransaction().rollback();

        } finally {

            HibernateSessionFactory.closeSession();

        }

    }


}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值