Hsql 查询_sql数据查询

Hsql 查询_sql数据查询还是班级,学省

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

                       还是班级,学生,课程,学生选课,四张表初始值:

Hsql 查询_sql数据查询Hsql 查询_sql数据查询

    1,查询所有的学生

session.createQuery("from Student s").list()

sql语句:

Hibernate: 
    select
        student0_.stu_id as stu1_0_,
        student0_.class_id as class5_0_,
        student0_.stu_birth as stu2_0_,
        student0_.stu_name as stu3_0_,
        student0_.stuSex as stuSex0_ 
    from
        tb_student student0_

2,将学生表和课程表做隐式连接查询:

session.createQuery("from Student s  where s.stuCourses.stuCourseId>:id").setInteger("id", 0).list();

出现异常: org.hibernate.QueryException: illegal attempt to dereference collection原因是在Hibernate 3.0 以后对关联实体是集合的属性,不能直接使用隐式连接查询,改成:

Session session=HibernateSessionFactory.getSession();
		List<Object[]> scs=session.createQuery("from Student s inner join s.stuCourses sc where sc.stuCourseId>:id").setInteger("id", 0).list();
		//List<Object[]> scs=session.createQuery("from Student s  where s.stuCourses.stuCourseId>:id").setInteger("id", 0).list();
		for(Object[] o:scs){
			Student s=(Student)o[0];
			StuCourse sc= (StuCourse)o[1];
			System.out.println("stuName:"+s.getStuName()+"stuCourseName:"+sc.getCourse().getCourseName());
		}

结果:

Hibernate: 
    select
        student0_.stu_id as stu1_0_0_,
        stucourses1_.sc_id as sc1_2_1_,
        student0_.class_id as class5_0_0_,
        student0_.stu_birth as stu2_0_0_,
        student0_.stu_name as stu3_0_0_,
        student0_.stuSex as stuSex0_0_,
        stucourses1_.course_id as course4_2_1_,
        stucourses1_.sc_score as sc2_2_1_,
        stucourses1_.sc_time as sc3_2_1_,
        stucourses1_.stu_id as stu5_2_1_ 
    from
        tb_student student0_ 
    inner join
        tb_stuCourse stucourses1_ 
            on student0_.stu_id=stucourses1_.stu_id 
    where
        stucourses1_.sc_id>?

生成的集合的元素,是由Student,和StuCourse两个实体组成的数组,如果只需要保留一个实体  hsql改成:

session.createQuery("select s from Student s inner join s.stuCourses sc where sc.stuCourseId>:id").setInteger("id", 0).list();

3,使用 left/right out join 查询:

session.createQuery(“select s from Student s left outer join s.stuCourses sc”).list();

生成的sql语句:

Hibernate: 
    select
        student0_.stu_id as stu1_0_,
        student0_.class_id as class5_0_,
        student0_.stu_birth as stu2_0_,
        student0_.stu_name as stu3_0_,
        student0_.stuSex as stuSex0_ 
    from
        tb_student student0_ 
    left outer join
        tb_stuCourse stucourses1_ 
            on student0_.stu_id=stucourses1_.stu_id

right outer join:

session.createQuery("select s from Student s right outer join s.stuCourses sc").list();

sql:

Hibernate: 
    select
        student0_.stu_id as stu1_0_,
        student0_.class_id as class5_0_,
        student0_.stu_birth as stu2_0_,
        student0_.stu_name as stu3_0_,
        student0_.stuSex as stuSex0_ 
    from
        tb_student student0_ 
    right outer join
        tb_stuCourse stucourses1_ 
            on student0_.stu_id=stucourses1_.stu_id

4,使用分页查询:

(List<Student>)session.createQuery(“from Student s”).setFirstResult(1).setMaxResults(2).list();

setFirstResult()从哪条记录开始,setMaxResult()每次取多少条记录

Hibernate: 
    select
        student0_.stu_id as stu1_0_,
        student0_.class_id as class5_0_,
        student0_.stu_birth as stu2_0_,
        student0_.stu_name as stu3_0_,
        student0_.stuSex as stuSex0_ 
    from
        tb_student student0_ limit ?,
        ?

在MySql里面调用的还是 limit 关键字 来进行分页

5,使用条件查询:

//学生根据班级,性别,出生年月进行查询
	public List<Student> getRightStudent(){// 使用条件查询
		Session session=HibernateSessionFactory.getSession();
		return session.createCriteria(Student.class).add(Restrictions.eq("stuSex", true)).createCriteria("myClass").add(Restrictions.eq("classId", 1)).list();
	}

注意,虽然添加了导航属性“myClass”  但最终结果的元素 还是 Student 实体 看sql:

Hibernate: 
    select
        this_.stu_id as stu1_0_1_,
        this_.class_id as class5_0_1_,
        this_.stu_birth as stu2_0_1_,
        this_.stu_name as stu3_0_1_,
        this_.stuSex as stuSex0_1_,
        theclass1_.classId as classId1_0_,
        theclass1_.className as className1_0_ 
    from
        tb_student this_ 
    inner join
        tb_class theclass1_ 
            on this_.class_id=theclass1_.classId 
    where
        this_.stuSex=? 
        and theclass1_.classId=?

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/190666.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • c++利用mutex(互斥量)实现多线程「建议收藏」

    c++利用mutex(互斥量)实现多线程「建议收藏」C++使用内核对象互斥体(Mutex)实现线程同步锁,当两个线程共同访问一个共享资源时,Mutex可以只向一个线程授予访问权。下面的例子模拟了售票系统,定义了两个售票线程///ConsoleApplication1.cpp:定义控制台应用程序的入口点。////mutex#include”stdafx.h”#include<stdio.h>#include<windows.h>#include<process.h>void__cdecl.

    2022年6月26日
    28
  • java女人_Java是一个事业成功的女人

    java女人_Java是一个事业成功的女人原标题:Java是一个事业成功的女人文/北京达内教育(微信号:bjtedu01)关注后免费可获得达内5天训练营,都是干货哦~Java是一个事业成功的女人。很多在她手下干过的人都感觉她的能力跟她的地位并不般配,她更多的是通过技巧打动了中层管理人员。你也许会认为她是很有智慧的人,你愿意跟随她。但你要准备好在数年里不断的听到“你用错了接口,你遗漏了一个分号”这样的责备。C++是Java的表姐。她在…

    2022年7月7日
    26
  • 【网盘搭建】使用Rclone挂载Google Drive扩容服务器存储,实现网盘无限容量[通俗易懂]

    【网盘搭建】使用Rclone挂载Google Drive扩容服务器存储,实现网盘无限容量[通俗易懂]一,前言1,Rclone是什么Rclone是一个开源的命令行程序,用于管理云存储上的文件。它是云供应商Web存储界面的功能丰富的替代方案。超过50种云存储产品支持Rclone,包括S3对象存储,GoogleDrive,OneDrive等业务和消费者文件存储服务以及标准传输协议。2,它能用来干嘛可以备份(和加密)文件到云存储。从云存储还原(和解密)文件。将云数据镜像到其他云服务或本地。将数据迁移到云,或在云存储供应商之间迁移。将多个加密的,缓存的或多样化的云存储作为磁盘挂载。3,项目地址Gith

    2022年7月16日
    45
  • 使用树莓派实现的口罩检测

    使用树莓派实现的口罩检测基于树莓派3B+官方摄像头两个指示灯实现的口罩检测项目演示链接口罩检测项目地址使用的口罩检测项目是AIZOO团队实现的使用的是目标检测常用的SSD算法。(由于疫情在家连不上实验室的服务器我无法训练)项目GitHub链接AIZOO团队给出的代码在Windows上很容易以跑通。配置的环境相对比较容易。也不需要很复杂的更改代码。因为模型较小我想出要在树莓派上运行,就进行了一些尝试。但是要在树莓派上运行需要修改一些代码。树莓派配置参考链接有很多基础配置对树莓派进行换源.

    2022年6月5日
    136
  • numpy tile方法_python中的numpy模块

    numpy tile方法_python中的numpy模块numpy中tile的用法

    2022年4月21日
    53
  • vue $attrs的使用

    vue $attrs的使用$attrs的使用vue$attrs是在vue的2.40版本以上添加的。项目中有多层组件传参可以使用$attrs,可以使代码更加美观,更加简洁,维护代码的时候更方便。如果使用普通的父子组件传参prop和$emit,$on会很繁琐;如果使用vuex会大材小用,只是在这几个组件中使用,没必要使用vuex;使用事件总线eventBus,使用不恰当的话,有可能会出现事件多次执行。如果给组件传递…

    2022年10月18日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号