Query对象
方便的对数据库和持久化对象进行查询,两种表达方式:HQL和SQL;
Query经常用来绑定查询参数,限制查询条数。并最终执行查询语句。
HQL
查询一个简单类(查询所有)
1 2 3 4 5 6 7 8 9 10 11 | @Test //修改方法 public void test3(){ Session session = HibernateUtils.getSession(); // 相当于得到一个 Connection 。 // 操作 Query query = session.createQuery( "from User" ); List list = query.list(); System. out .println(list); //不需要关闭Configuration 因为Configuration不是轻量级的。这样一个项目就只产生一个Configuration //configuration相当于连接池 session. close (); } |
分页查询
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | @Test //修改方法 public void test3(){ Session session = HibernateUtils.getSession(); // 相当于得到一个 Connection 。 // 操作 Query query = session.createQuery( "from User" ); query.setFirstResult(0);//设置开始的位置 query.setMaxResults(10);//设置查询多少条 List list = query.list(); for (Object object : list) { System. out .println(object); } //不需要关闭Configuration 因为Configuration不是轻量级的。这样一个项目就只产生一个Configuration //configuration相当于连接池 session. close (); } |
查看指定列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @Test //查询指定列 public void test4(){ Session session = HibernateUtils.getSession(); // 相当于得到一个 Connection 。 // 操作 //查询指定列时,必须在javabean中提供该字段的构造方法 其他列为空 Query query = session.createQuery( "select new User(username,password) from User" ); List< User > list = query.list(); for ( User u : list) { System. out .println(u); } //不需要关闭Configuration 因为Configuration不是轻量级的。这样一个项目就只产生一个Configuration //configuration相当于连接池 session. close (); } |
条件查询
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | @Test //条件查询(无名称参数) public void test5(){ Session session = HibernateUtils.getSession(); // 相当于得到一个 Connection 。 // 操作 //查询指定列时,必须在javabean中提供默认的构造方法(无参构造) //因为有参会替换无参 然而在条件查询时会调用无参构造 /*条件查询(无名称参数) * Query query = session.createQuery("from User where username=?"); query.setParameter(0, "zhangsan111");*/ //条件查询(有名称参数) Query query = session.createQuery( "from User where username=:myusername" ); query.setParameter( "myusername" , "zhangsan111" ); User user = ( User ) query.uniqueResult(); System. out .println( user ); //不需要关闭Configuration 因为Configuration不是轻量级的。这样一个项目就只产生一个Configuration //configuration相当于连接池 session. close (); } |
命名查询
在customer.hbm.xml中class标签外定义一个<query>标签
1 2 3 | <query name = "select1" > from Customer where id=? </query> |
测试方法
1 2 3 4 5 6 7 8 9 10 11 12 | @Test //测试命名查询 public void test03(){ Session session = HibernateUtils.getSession(); Transaction bt = session.beginTransaction(); Query qy = session.getNamedQuery( "select1" ); qy.setParameter(0, 1);//添加参数 Customer ct = (Customer) qy.uniqueResult(); System. out .println(ct.getId()); //操作 bt. commit (); session. close (); } |
SQL
查询所有
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | @Test //sql查询 public void test6(){ Session session = HibernateUtils.getSession(); // 相当于得到一个 Connection 。 // 操作 SQLQuery query = session.createSQLQuery( "select * from user" ); List<Object[]> list = query.list(); for (Object object : list) { //打印地址值 System. out .println(object); } /*object对象指向User类 * query.addEntity(User.class); List<User> list = query.list(); for (User user : list) { System.out.println(user); }*/ //不需要关闭Configuration 因为Configuration不是轻量级的。这样一个项目就只产生一个Configuration //configuration相当于连接池 session. close (); } |
条件查询
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @Test //sql条件查询() public void test7(){ Session session = HibernateUtils.getSession(); // 相当于得到一个 Connection 。 // 操作 SQLQuery query = session.createSQLQuery( "select * from user where username=?" ); query.setParameter(0, "zhangsan111" ); //object对象指向 User 类 query.addEntity( User .class); User user = ( User ) query.uniqueResult();//转换时还是会让Query对象识别到 User 这个类 System. out .println( user ); //不需要关闭Configuration 因为Configuration不是轻量级的。这样一个项目就只产生一个Configuration //configuration相当于连接池 session. close (); } |
Criteria对象
查询所有
1 2 3 4 5 6 7 8 9 10 11 12 13 | @Test //Criteria查询全部 public void test8(){ Session session = HibernateUtils.getSession(); // 相当于得到一个 Connection 。 // 操作 Criteria criteria = session.createCriteria( User .class); List list = criteria.list(); for (Object object : list) { System. out .println(object); } //不需要关闭Configuration 因为Configuration不是轻量级的。这样一个项目就只产生一个Configuration //configuration相当于连接池 session. close (); } |
单条件查询/多条件查询
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @Test //Criteria条件查询查询 public void test9(){ Session session = HibernateUtils.getSession(); // 相当于得到一个 Connection 。 // 操作 Criteria criteria = session.createCriteria( User .class);<br> //条件1 criteria. add (Restrictions.eq( "username" , "zhangsan111" ));<br> //条件2<br> criteria. add (Restrictions.eq( "username" , "zhangsan111" ));<br> List list = criteria.list(); for (Object object : list) { System. out .println(object); } //不需要关闭Configuration 因为Configuration不是轻量级的。这样一个项目就只产生一个Configuration //configuration相当于连接池 session. close (); } |
条件或
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | @Test //Criteria条件查询查询 or public void test10(){ Session session = HibernateUtils.getSession(); // 相当于得到一个 Connection 。 // 操作 Criteria criteria = session.createCriteria( User .class); //条件1 criteria. add (Restrictions. or (Restrictions.eq( "username" , "zhangsan111" ),Restrictions.eq( "username" , "fanjiankang" ))); List list = criteria.list(); for (Object object : list) { System. out .println(object); } //不需要关闭Configuration 因为Configuration不是轻量级的。这样一个项目就只产生一个Configuration //configuration相当于连接池 session. close (); } |
Cariteria只是对于criteria的方法进行对于sql语句的控制,这样整个开发过程及其检索;
使用离线查询
1 2 3 4 5 6 7 8 9 10 11 12 | @Test //测试离线查询 public void test04(){ DetachedCriteria dc=DetachedCriteria.forClass( Order .class); dc. add (Restrictions. between ( "id" , 10, 20)); Session session = HibernateUtils.getSession(); Transaction bt = session.beginTransaction(); Criteria criteria = dc.getExecutableCriteria(session); List list = criteria.list(); System. out .println(list); bt. commit (); session. close (); } |
多表关联查询
交叉连接
内连接
显式内连接 inner join with(where)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | @Test //测试显式连接查询 public void test05(){ Session session = HibernateUtils.getSession(); Transaction bt = session.beginTransaction();<br> // 表一 inner join 表二 String hql= "from Customer c inner join c.orders" ;// "from Customer c inner join c.orders with c.id=1" Query query = session.createQuery(hql); List<Object[]> list = query.list(); for (Object[] objects : list) { for (Object obj : objects) { System. out .println(obj); } } //操作 bt. commit (); session. close (); } |
隐式内连接
隐式内连接: 使用 "逗号"将表分开,使用 WHERE 来消除迪卡尔积
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @Test //测试隐式内连接查询 public void test06(){ Session session = HibernateUtils.getSession(); Transaction bt = session.beginTransaction(); String hql= "from Order o where o.c.id=1" ; Query query = session.createQuery(hql); List< Order > list = query.list(); for ( Order o : list) { System. out .println(o); } //操作 bt. commit (); session. close (); } |
迫切连接
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 迫切内连接得到的结果是直接封装到 PO 类中,而内连接得到的是 Object[]数组,数组中封 装的是 PO 类对象。 @Test //测试迫切内连接查询 public void test08(){ Session session = HibernateUtils.getSession(); Transaction bt = session.beginTransaction(); String hql= "from Order o inner join fetch o.c" ; Query query = session.createQuery(hql); List< Order > list = query.list(); for ( Order o : list) { System. out .println(o); } //操作 bt. commit (); session. close (); } |
外连接
左外连接
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | @Test //测试左外连接查询 public void test09(){ Session session = HibernateUtils.getSession(); Transaction bt = session.beginTransaction(); String hql= "from Customer c left outer join c.orders" ; Query query = session.createQuery(hql); List<Object[]> list = query.list(); for (Object[] objects : list) { for (Object obj : objects) { System. out .println(obj); } } //操作 bt. commit (); session. close (); } |
迫切左外连接
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @Test //测试左迫切外连接查询 public void test10(){ Session session = HibernateUtils.getSession(); Transaction bt = session.beginTransaction(); String hql= "from Order o left outer join fetch o.c " ; Query query = session.createQuery(hql); List< Order > list = query.list(); for ( Order o : list) { System. out .println(o); } //操作 bt. commit (); session. close (); } |
右外连接
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | @Test //测试左外连接查询 public void test11(){ Session session = HibernateUtils.getSession(); Transaction bt = session.beginTransaction(); String hql= "from Customer c right outer join c.orders" ; Query query = session.createQuery(hql); List<Object[]> list = query.list(); for (Object[] objects : list) { for (Object obj : objects) { System. out .println(obj); } } //操作 bt. commit (); session. close (); } |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 后端思维之高并发处理方案
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· 后端思维之高并发处理方案
· 千万级大表的优化技巧
· 在 VS Code 中,一键安装 MCP Server!
· 10年+ .NET Coder 心语 ── 继承的思维:从思维模式到架构设计的深度解析
· 上周热点回顾(3.24-3.30)