1. 程式人生 > >hibernate查詢部分欄位

hibernate查詢部分欄位

hibernate查詢

hibernate,使用中會發生這樣的情況,有一個實體如Employee它欄位多而且也關聯了許多實體,這時候當我查詢所有的在職Employee時候,只用到了它的id和name但是卻不得已需要查出所有的欄位。這種查詢很慫而且很慢。
在經過一頓瞎搞之後總結出了兩種比較有效的過濾方式.
1. 實體增加構造方法,hql直接new 該實體,傳入欄位
2. 使用VO,呼叫Hibernate:setResultTransformer方法

實體增加構造

故名思意就是在實體中增加建構函式,在hql直接使用new傳入構造方法

@Entity
public class Employee
implements Serializable{
public Employee(){} public Employee(long id,String name_cn){ setId(id); setName_cn(name_cn); } public Employee(long id,String name_cn,String jobName){ this(id,name_cn); setJobName(jobName); } }

在hql裡通過使用 new關鍵字來,呼叫構造方法,減少查詢出來的欄位

String hql=”select new Employee(e.id,e.name_cn) from Employee e”;
使用實體增加構造的方法來限制查詢欄位有缺陷,無法實現級聯查詢,而且實體關係過於複雜,破壞了實體類的統一性,無法保證每次new出來的例項為同一狀態

使用Vo來減少查詢欄位

VO值物件(Value Object)


  1. VO 是用 new 關鍵字建立,由 GC 回收的。
  2. VO 是值物件,精確點講它是業務物件,是存活在業務層的,是業務邏輯使用的,它存活的目的就是為資料提供一個生存的地方。
  3. VO 的屬性是根據當前業務的不同而不同的,也就是說,它的每一個屬性都一一對應當前業務邏輯所需要的資料的名稱。
  4. 以上都是百度,我理解的意義:現在為了查一個物件,只用到其中某些值,要查所有的值,太!慢!,前段時間發現可以在hql裡使用建構函式,後來就使用建構函式達到減少查詢,但是使用建構函式,會修改到實體類,雖然沒什麼不好但是感覺怪怪的,而且無法實現聯級查詢欄位,用起來不方便。VO相當於在資料查詢加了一層model,只查詢出使用的屬性的欄位設定到VO裡。
    要使用VO,在hibernate底層QUERY查詢需修改為

Query query = getSession().createQuery(hql).setResultTransformer((Transformers.aliasToBean(clazz)));
使用VO需定義VO,同時hql select出來的欄位要與VO定義的相同:

    class VO{
        private id,name,orgName;
        getter,setter;
    }
    hql="select e.id as id,e.name as name,e.org.name as orgName from Employee e where e.deleteStatus=?"

相關推薦

hibernate查詢部分

hibernate查詢 hibernate,使用中會發生這樣的情況,有一個實體如Employee它欄位多而且也關聯了許多實體,這時候當我查詢所有的在職Employee時候,只用到了它的id和name但是卻不得已需要查出所有的欄位。這種查詢很慫而且很慢。 在經

Hibernate中用hql查詢部分

在hibernate中,用hql語句查詢實體類,採用list方法的返回結果為一個List,該List中封裝的物件分為以下三種情況: 1.查詢全部欄位的情況下,如"from 實體類",list中封裝的物件為實體類本身,各屬性都將得到填充。 2.只查詢一個欄位,預設情況下

Hibernate中用hql查詢部分 可解決異常java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to

hql查詢單表部分欄位: 在hibernate中,用hql語句查詢實體類,採用list方法的返回結果為一個List,該List中封裝的物件分為以下三種情況: 1.查詢全部欄位的情況下,如"from 實體類",list中封裝的物件為實體類本身,各屬性都將得到填充。 2.只查詢一個欄位,預設情況下,list中封

關於mybatis多表查詢查詢部分,而丟失一整條資料問題

今天在寫一個list資料按某欄位排序問題時遇到了一個問題,就是有很多個數據這個欄位一樣時,只會查出來一個。 如下 頁面,5條資料只查出來3條資料 基礎資訊和接單什麼資訊的分成了2個表,根據接單數排名 select e.engineer_name,

Mybatis查詢部分

解決問題:資料庫表裡面很多欄位不太需要,有時只想取到裡面的部分欄位的值,如果重新定義 DTO 會比較麻煩。 BookMapper.xml 檔案中定義如下: <!-- Book全部欄位 --> <resultMap id="BaseRes

Hibernate hql 查詢 指定 並獲取結果集

1. 查詢整個對映物件所有欄位 Java程式碼        //直接from查詢出來的是一個對映物件,即:查詢整個對映物件所有欄位                

SpringBoot:SpringData JPA:進階查詢—JPQL/原生SQL查詢、分頁處理、部分對映查詢

上一篇介紹了入門基礎篇SpringDataJPA訪問資料庫。本篇介紹SpringDataJPA進一步的定製化查詢,使用JPQL或者SQL進行查詢、部分欄位對映、分頁等。本文儘量以簡單的建模與程式碼進行展示操作,文章比較長,包含查詢的方方面面。如果能耐心看完這篇文章,你應該能使用SpringDataJ

【轉】mysql查詢根據部分去重

mysql有個關鍵字distinct用來去重的,但是使用時只能放在查詢欄位的最前邊 如: SELECT DISTINCT user_id,age FROM t_user; 若不是放在最前邊,如: SELECT user_id, DISTINCT age FROM t_us

Hibernate關於查詢Timestamp總結

之前在Mysql中做條件查詢遇到點問題,經過科普以後,總結對Timestamp使用遇到的問題,希望對大家有幫助。 1. 如何查詢某一天的資料? 解決的辦法有很多種,我說一種我的做法,算是比較簡單的:我們知道在Mysql中Timestamp欄位的格式為yyyy-MM-dd HH-mm-

springboot +JPA自定義查詢返回部分的返回值型別,用Integer型別作為模糊查詢的條件

今天遇到一個問題記錄下來。 使用的是springboot 2.1.1 jpa連線MySQL資料庫 資料庫表: 我想通過sid的模糊查詢來生成下拉列表。 開始想用jpa提供的一種方法名稱查詢,於是在dao中定義了public List findBySidLike(Integer sid) 方

oracle利用分析函式row_number()over()查詢一張表所有並按照其中部分分組查詢最大值

先準備資料: deptid :部門id. parent_deptid :deptid 的父級部門,也就是depid 是他的子部門。 create table test_employee (empid int ,deptid int ,parent_deptid int,sa

hibernate hql 查詢指定並獲取結果集,多表查詢結果集

原文轉自:http://blog.csdn.net/ljfbest/article/details/7472042在hibernate中,用hql語句查詢實體類,採用list方法的返回結果為一個List,該List中封裝的物件分為以下三種情況: 1.查詢全部欄位的情況下,如

hibernate update 只更新部分的3種方法(轉載)

hibernate 中如果直接使用 Session.update(Object o); 會把這個表中的所有欄位更新一遍。 比如: public class Teacher Test { @Test public void update(){ Session session

Hibernate——僅更新部分

介紹兩種方法 1.Annotation設定@Column(updatable=false) 在不需要更新的屬性上新增這個註解。這種方法不靈活,很少使用。 2.使用HQL @Test public

hibernate用hql怎麼查詢某個

List results = session.find("select count(*), avg(user.age) from User as user"); ListIterator iterator = results.listIterator(); Object

hibernate update 只更新部分的3種方法

Hibernate 中如果直接使用 Session.update(Object o); 會把這個表中的所有欄位更新一遍。 比如: public class TeacherTest { @Test public void update(){

Hibernate使用原生SQL多表查詢名相同導致查詢資料覆蓋問題解決辦法

系統測試環境: MySQL 5.0 Hibernate 3.3 由於使用了hibernate,雖然使用原生SQL繞過了hibernate自己的封裝,但是還是有些影響,比如欄位別名問題;相同的欄位名經過hibernate查詢會出現前一列覆蓋後一列的情況,這時可以用 方法來

使用hibernate執行原生update更新資料(只更新部分

事務根據實際情況進行新增,這裡不特殊說明 1、使用update執行更新部分欄位 String sql = " update  A set  a.grade= :grade,a.gradeType =

hibernate中的update方法只更新部分的方法

Hibernate 中如果直接使用 Session.update(Object o); 會把這個表中的所有欄位更新一遍。 比如: ? 1 2 3 4 5 6 7 8 9 10 11 12 public class Teacher

Spring data jpa高階查詢部分查詢,過濾查詢,空字元過濾

@PersistenceContext private EntityManager em;String hql = "select new WorkflowTask(taskId,v