1. 程式人生 > >Hibernate自定義SQL查詢結果自動反射到POJO

Hibernate自定義SQL查詢結果自動反射到POJO

在hibernate中,當自己用到自定義SQL查詢時,結果集和pojo類的欄位一模一樣,又想方便快捷的不用手動的對映到pojo上,相信大家都遇到過.

看如下程式碼POJO

// 年份
	private String month;
	// 月份
	private String year;
	// 狀態
	private Long status;
	// 建立人
	private String createEmpCode;
	// 建立時間
	private Date createDate;
	// 修改人
	private String updateEmpCode;
	// 修改時間
	private Date updateDate;   get() set()省略....
Mapping.xml略...相信大家都會

查詢的SQL:

SELECT
        nvl(t.e_year,
        '無') AS year,
        l.m AS month,
        nvl(t.status,0) as status,
        t.create_emp_code as createEmpCode,
        t.create_date as createDate,
        t.update_emp_code as updateEmpCode,
        t.update_date as updateDate 
    FROM
        (SELECT
            LEVEL m 
        FROM
            dual CONNECT 
        BY
            LEVEL <= 12) l 
    LEFT OUTER JOIN
        table t 
            ON l.m = t.e_month 
            AND t.e_year = 1 
            AND t.e_page = 4
    ORDER BY
        l.m 
要注意的是,查詢出來的欄位名稱最好和POJO類的屬性名一致,要是出現什麼行對應不上的錯誤,大家自己可以去嘗試.

SSH整合查詢程式碼,純Hibernate寫法,主要涉及到一個類(關鍵吶!) 

@SuppressWarnings("unchecked")
	public Collection<Table> findBy(final QueryObj queryObj) {
		final String sql = "SELECT nvl(t.e_year, '無') AS year,l.m AS month,nvl(t.status, 0) as status,"
			+ " t.create_emp_code as createEmpCode,t.create_date as createDate," 
			+ " t.update_emp_code as updateEmpCode,t.update_date as updateDate"
			+ " FROM (SELECT LEVEL m FROM dual CONNECT BY LEVEL <= 12) l"
			+ " LEFT OUTER JOIN table t ON l.m = t.e_month AND t.e_year = ? AND t.e_page = ?"
			+ " ORDER BY l.m ";
		final String year = "year";
		final Long page = 1;
		return (Collection<Table>) super.getHibernateTemplate().execute(
				new HibernateCallback() {
					public Object doInHibernate(Session session)
							throws HibernateException, SQLException {
						SQLQuery query = session
								.createSQLQuery(sql);
						query.setString(0, year);
						query.setLong(1, page);
						//這裡用addScalar指定查詢結果集欄位轉換,尤其是用到sql函式時第一個引數是as 別名,第二個是返回值的型別
						query.addScalar("year", Hibernate.STRING);
						query.addScalar("month", Hibernate.STRING);
						query.addScalar("status", Hibernate.LONG);
						query.addScalar("createEmpCode", Hibernate.STRING);
						query.addScalar("updateEmpCode", Hibernate.STRING);
						query.addScalar("createDate", Hibernate.DATE);
						query.addScalar("updateDate", Hibernate.DATE);
						//關鍵轉換方法query.setResultTransformer,引數AliasToBeanResultTransformer(對映到的POJO類).
						query.setResultTransformer(new AliasToBeanResultTransformer(Table.class));
						//OK hibernate會自動對映過去,如果不用這個方法它返回的時候是Collection<Object>,所以不能起到轉換的作用,在JBoss中執行查詢時會報錯的.
						return query.list();
					}
				});
	}

 以上的方法用query.addEntity(將查詢到的記錄與特定的實體關聯。)不管用可能是sql的原因,查詢的基表為Table時才關聯上,如果是多表關聯,基表又不對應,必須是哪個方法才行,還要設定addScalar方法,還有:查詢類是SQLQuery可不是Query,兩個類提供的方法是不一樣的.


相關推薦

Hibernate定義SQL查詢結果自動反射POJO

在hibernate中,當自己用到自定義SQL查詢時,結果集和pojo類的欄位一模一樣,又想方便快捷的不用手動的對映到pojo上,相信大家都遇到過. 看如下程式碼POJO // 年份 private String month; // 月份 private String

hibernate 定義sql createSQLQuery多表join查詢查詢定義vo物件

由於要做個left join所以要搞個vo物件 LogManageVo.java 裡面就寫屬性和get set方法就可以了 import com.sevnce.log.entity.LogMan

spring boot 學習心得 使用JpaRepository註解定義SQL查詢數據庫多表查詢

自定義 net http entity onetomany tom pri 查詢語句 重點 一. 首先在@Entity註解的類裏面要寫好外鍵關系. 這個 @ManyToOne 註解可以建立外鍵關系, 不要在自己傻傻的寫一個 private int grades_id;

SQL 查詢結果自動遞增序列號

一、讓SELECT查詢結果額外增加自遞的偽序號列 在基於資料庫的系統的開發過程中,有時需要讓select返回的查詢結果中存在一列實際的資料庫表中並不存在的序號列,即在查詢結果中額外增加自增的偽序號列。從網路上可以找到一些解決方案,但總結起來主要有三種: 1.使用資料庫自帶的序號函式實現 Oracle提供的RO

spring-data-JPA使用JpaRepository註解定義SQL查詢資料庫多表查詢

一. 首先在@Entity註解的類裡面要寫好外來鍵關係.  這個 @ManyToOne 註解可以建立外來鍵關係, 不要在自己傻傻的寫一個 private int grades_id;  寫了這個註解以後它會自動的把 Classes 這張表加上 grades_id 欄位.

定義sql查詢並封裝為指定實體

原理:通過java反射,得到實體屬性對應的欄位名稱及型別,並用原生的jdbc執行查詢並封裝。 直接看原始碼: 1.實體:Zztestpackage demo.linj.test; import java.text.NumberFormat; public class

Spring boot jdbc 定義SQL查詢

閒來沒事,中午學了spring boot 感覺還不錯,避免了繁瑣的配置檔案,提高開發效率還不錯。個人認為spring boot也就簡化配置而已。在學習中也遇到一些問題,@Autowired無法自動裝入bean,是由於對spring boot 不夠了解,先上程式碼

hibernate 使用普通sql查詢,對映到定義pojo

public List<InsuranceRecordVo> getCustomRecodeListByCustomId2(String customId){ String sql="

hibernate使用setResultTransformer()將SQL查詢結果放入集合中

-h cal 們的 gpo ict dds eas find ans 在平時開發中Hibernate提供的hql基本能夠滿足我們的日常需求。但是在有些特殊的情況下,還是需要使用原生的sql,並且希望sql查詢出來的結果能夠綁定到pojo上。hibernate API中的cr

Hibernate通過編寫sql查詢

ppr checked str .class erp create UNC dde string public List<InterProductMsg> selectIsHaveProductid(String productId) { String sq

Hibernate在進行SQL查詢,並把查詢結果繫結到POJO物件。

我們通過註解的方式可以把一個實體物件繫結到一個數據表。然後用Hibernate操作這個物件對錶進行資料操作。也可以用Hql來查詢並自動把結果繫結到@Entity物件中。   但是我們可能也會碰到這種情況,當我們要做一些資料統計的時候,查詢可能會牽扯到多張表的查詢。所以用Hql可能就達不到我們要查詢的

Activit定義SQL語句查詢

String organid = "admin"; List<Model> listModel = null; try { //獲取該使用者建立的模型

JPA原生SQL定義SQL)分頁查詢邏輯

JPA自己寫SQL查詢的話,分頁還稍微麻煩,經過測試下面方法可以: @Query(nativeQuery = true, value = "select * from goods where " +

Spring JPA 定義實體類和定義sql語句多表關聯複雜子查詢

   最近在寫一個功能,因為不是很熟悉jpa操作,接觸時間不久,所以又習慣性地用了sql語句來查詢,主要是嫌麻煩,想返回的資料用一條資料返回來就可以了,所以就用spring  jpa寫了個自定義的實體類來裝我專門返回來的資料欄位,然後sql也有點複雜,join了幾張表,

mybatis逆向工程的Example類用法==筆記==【單表操作只需呼叫,多表查詢需要定義sql+mapper介面方法(待補全)】

======上程式碼: ===版本1: @Service public class BaseDictServiceImpl implements BaseDictService { //查詢資料字典表,注入資料字典表mapper介面代理物件 @Autowired

記一次偽*sql查詢結果不一致的

vid eight frame and sna parameter -exec video http 調試代碼發現,兩個操作最後都會調用同一個方法。傳入的參數一致,查詢結果卻不一致。 直接說問題原因:我的兩個操作是aop環繞通知先拿到傳入參數以後,校驗是否需要往另一張表中插

sql 查詢結果導出到excel

過程 book 查詢 color shell 業務 文件的 arch exce 在平時工作中經常會遇到,sql 查詢數據之後需要發送給業務人員,每次都手工執行腳本然後拷貝數據到excel中,比較耗時耗力,可以考慮自動執行查詢並將結果郵件發送出來。 分兩步實現: 1、執行

sql查詢結果存入DataTable,然後從DataTable取數據

結果 ble body 查詢 取數 select columns class span for (int i = 0; i < dt.Rows.Count; i++) { string s = "select

篩選出sql 查詢結果中 不包含某個字符

title www. char kdt nbsp ofo pos ali ati select * from table1 where patindex(‘%關鍵字%‘ , aa) = 0 select * from table1 where charindex(‘關鍵字

SQL查詢結果為二維表

mon 結果 else AS table case when create lse nio 1 ---測試數據--- 2 if object_id(‘[tb]‘) is not null drop table [tb] 3 go 4 create tabl