Hibernate 查询结果的展现
Hibernate 查询结果的展现,Hibernate是通过对象包含对象这样的方式来维护关系的,那么当我们需要查询关联对象的时候,先通过Hib
我们使用hibernate(以下简称h)来管理数据库表的关联关系,基本的原理其实是很简单的,就是将数据库中表之间的关联转移到了实体bean的类之间,配置好了以后h就可以帮我们维持这种关联关系了。这的确带来了很大的方便,我们可以在我们的程序中以hql来面向对象的获取或保存数据了,例如以前我们要查询一个班级里面的学生的信息,自己写sql的话需要关联2张表,而且还要自己手动的将查询到的数据一个一个的取出来,然后封装到我们的bean里面去最后才能字啊jsp中显示出来,这个过程是很繁琐的,有了h,我们就可以不用在sql显式的写这种关联关系了,我们选择将这种关联关系写到h的映射文件中去,这样一来h就帮我们维护这种关系了,我们需要查询班级里面的学生的信息的时候,只要通过hql: from Class as c where c.id=:id;就可以得到具体的一个班级的实体对象(假设是c),接着Set
通过上面我们知道,Hibernate是通过对象包含对象这样的方式来维护关系的,那么当我们需要查询关联对象的时候,先通过Hibernate得到主对象,再调用主对象的get×得到关联对象,就可以获取关联信息了,然后组装数据到jsp上去显示。 我们可以简单的写成:hql=“select new map(c.id as id ,c.name as name,c.students[0].name as studentname) from Class as c where c.id=:id”; 这样就同时完成了数据的查询和组装。将查询到的数据组装到一个map中,as 后面的就是 map的key,map的值就是查询出来的数据了。这种数据组装方式比:
while (it.hasNext()) {
10 Object[] tuple = (Object[]) it.next();
11 Members members = (Members) tuple[ 0 ];
12 String className = (String) tuple[ 1 ];
要简洁很多。
当然,我们也可以定义自己的实体类来容纳查询出的数据:
selectnew NewMembers(members, classInfo.className) " +
3 " from Members members, ClassInfo classInfo " +
4 " where members.level = classInfo.classCode "
也可以 使用hibernateapi 函数 setResultTransformer 将查询结果存放到我们自定义的bo对象中去:
Query q = factory.getCurrentSession().createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(PostVO.class));关于数据组装,有很多方法,不一而论。我们下面要讨论的是,h在涉及到3张或3张以上的表的复杂的查询的时候,如何使用的问题。我们知道2张或者一张表的情形使用我们上面介绍的方式就足够了,但是对3张以上的表关联的复杂查询,我们则要比较2中方式的好坏了:一种方式是仍然将表关系通过配置映射文件交给h来管理,,这样一来我们不仅仅要在配置文件里配置多个关系,而且在对应的实体类里面也要加入关联属性,在查询的时候得到主实体对象以后还有多次调用其属性来获取关联表的信息,这样不是不可以,但是是比较繁琐的,稍微不注意就容易出现错误。如果要查询的表多于5张,最好的建议就是使用native sql来做,也就是通过直接执行sql语句来查询,表间的关联关系直接在sql语句里面写明,不要h来管理,这样一来少了h的配置,二来不需要定义每个表对应的实体类,也算省了很多事情,在使用native sql的时候有一些需要注意的地方: Session s = sessionFactory.openSession(); String sql="select book.bookname,borr.borrowTime,borr.backTime,pub.pubname,bs.name bookcasename,book.price from " +"(select * from tb_borrow where ifback=0) " +"as borr left join tb_bookinfo book on borr.bookid=book.id join tb_publishing pub " +"on book.isbn=pub.isbn join tb_bookcase bs " +" on book.bookcase=bs.id join tb_reader r on borr.readerid=r.id where r.barcode=?"; Query query=s.createSQLQuery(sql).addScalar("bookname", Hibernate.STRING) .addScalar("borrowTime", Hibernate.STRING). addScalar("backTime", Hibernate.STRING).addScalar("pubname", Hibernate.STRING). addScalar("bookcasename", Hibernate.STRING).addScalar("price", Hibernate.STRING); query.setParameter(0, barCode); List list=null; try{ list=query.list(); s.close(); } catch (Exception e) { e.printStackTrace(); } return list; 1. Session session = sessionFactory.openSession();session.createSQLQuery(sql);通过这种方式获得查询对象query。2. list=query.list();得到的是一个数组列表(ArrayList),其中列表的每个元素都是object类型的数组,代表查询结果的一条记录,也就是说h会将sql查询出来的其中的每个字段都强制转换成Object类型,然后组成一个数组方到list里面去。3.单纯使用s.createSQLQuery(sql)往往会报“找不到列”的错误,其实这是h对native sql支持的原因,因为Hibernate是通过使用ResultSetMetadata来判定返回的标量值的实际顺序和类型的,假若某个指定的类型没有被映射,或者不是你所预期的类型那么就会出现上述错误了,所以通过addScalar()明确指出返回什么列以及每个列的类型就可以避免上述错误了。最好你根据实际的类型将得到的object转换成实际的类型,就可以得到这些类型中保存的信息了。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

在SpringBoot專案中整合Hibernate前言Hibernate是一個流行的ORM(物件關係映射)框架,它可以將Java物件映射到資料庫表,從而方便地進行持久化操作。在SpringBoot專案中,整合Hibernate可以幫助我們更輕鬆地進行資料庫操作,本文將介紹如何在SpringBoot專案中整合Hibernate,並提供相應的範例。 1.引入依賴在pom.xml檔案中引入以下依賴:org.springframework.bootspring-boot-starter-data-jpam

Java是一種物件導向程式語言,它被廣泛地應用於軟體開發領域。 Hibernate是一種流行的Java持久化框架,它提供了一種簡單且高效的方式來管理Java物件的持久化。然而,開發過程中經常會遇到Hibernate錯誤,這些錯誤可能會導致程式的異常終止或不穩定。如何處理和避免Hibernate錯誤成為了Java開發者必須掌握的能力。本文將介紹一些常見的Hib

hibernate和mybatis的差別:1、實作方式;2、效能;3、物件管理的比較;4、快取機制。詳細介紹:1、實作方式,Hibernate是一個完整的物件/關係映射解決方案,將物件與資料庫表進行映射,MyBatis則需要開發者手動編寫SQL語句以及ResultMap;2、效能,Hibernate在開發速度上可能比MyBatis快,因為Hibernate簡化了DAO層等等。

Hibernate的一對多和多對多Hibernate是一個優秀的ORM框架,它簡化了Java應用程式與關係型資料庫之間的資料存取。在Hibernate中,我們可以使用一對多和多對多的關係來處理複雜的資料模型。 Hibernate的一對多在Hibernate中,一對多關係是指一個實體類別對應多個另一個實體類別。例如,一個訂單(Order)可以對應多個訂單項目(OrderItem),一個使用者(User)可以對應多個訂單(Order)。要在Hibernate中實作一對多關係,需要在實體類別中定義一個集合屬性來存

Hibernate是一個開放原始碼的ORM框架,它將關係型資料庫和Java程式之間的資料映射相互綁定,這樣可以讓開發人員更方便地存取資料庫中的資料。使用Hibernate框架可以大幅減少編寫SQL語句的工作,並提高應用程式的開發效率和可重複使用性。以下從以下幾個方面來介紹Hibernate框架。一、Hibernate框架的優點物件關係映射,隱藏資料庫存取細節,使開發

1.hibernate映射配置class標籤,用來建立類別與表之間的關係name:類別名,table:表名id標籤,建立中的屬性與表中的主鍵的對應關係property,建立類別中的普通屬性與表格的欄位的對應關係(1)首先我們要學會如何編寫映射配置文件,大家要知道編寫完的映射配置文件應與實體類在同一個包下,並且名稱應是類名.hbm.xml,所以我們要在com.meimeixia.hibernate.demo01套件下建立一個Customer.hbm.xml文件,但是它的限制該怎麼寫呢?可以在Hiberna

快取有助於減少執行查詢時的資料庫網路呼叫。一級緩存與會話連結。它是隱式實現的。一級緩存存在直到會話物件存在為止。一旦會話物件終止/關閉,將會有沒有快取物件。二級緩存適用於多個會話物件。它是連結的與會話工廠。二級緩存物件可供所有會話使用單一會話工廠。當特定會話發生時,這些快取物件將被終止工廠已關閉。實作二級快取我們需要新增以下相依性才能使用二級快取。 <!--https://mvnrepository.com/artifact/net.sf.ehcache/ehcache--><de

在本文中,我們將看到如何在Hibernate中執行批次插入/更新。每當我們執行一條sql語句時,我們都是透過對資料庫進行網路呼叫來完成的。現在,如果我們必須在資料庫表中插入10個條目,那麼我們必須進行10次網路呼叫。相反,我們可以透過使用批次來優化網路呼叫。批次允許我們在單一網路呼叫中執行一組SQL語句。為了理解和實作這一點,讓我們定義我們的實體−@EntitypublicclassParent{@Id@GeneratedValue(strategy=GenerationType.AUTO)
