1. 程式人生 > >【Hibernate】Hibernate的聚類查詢、分組查詢、排序與時間之差

【Hibernate】Hibernate的聚類查詢、分組查詢、排序與時間之差

在Hibernate中的HQL語句其實能夠基本能夠實現SQL語句所做的事情,正如jQuery至於javascript一樣。雖然HQL語句是對類的查詢,但是HQL在實行聚類查詢、分組查詢、排序與時間之差等查詢,也無須把查詢結果查詢出來,再通過對List的處理才得到結果。

比如有一張如下的Testtable表:


要像《【Mysql】求出離最近相差X天的項,sql語句關於日期的比對》(點選開啟連結)一樣,查詢date欄位離現在具有30年的項有多少,SQL語句則這樣寫:

select count(*) from testtable 
where 
timestampdiff(year,date,now())<30;
其查詢結果如下圖:


在Hibernate中的Java語句則如下實現,同時這樣輸出:

String hql="select count(*) from Testtable t where timestampdiff(year,t.date,now())<30"
String result=session.createQuery(hql).uniqueResult().toString();
System.out.println(result);
這裡利用了純粹的HQL查詢,同時返回結果唯一。省略Hibernate的初始化與配置等。

直接利用uniqueResult()的方法即可。

如果,查詢結果是多行的情況,比如還是對剛才的Testtable表進行查詢,

這次查詢的是在《【Mysql】利用group by附帶having進行聚類查詢》(點選開啟連結)查詢過的,在username出現次數多於1次,不含1次的項,並且降序排列,那麼sql語句則這樣寫:

select username,count(*) from testtable
group by username 
having coutn(*)>1
order by count(*) desc
其查詢結果如下圖:


在Hibernate中的Java程式則如下寫,關鍵是把查詢結果的每一行轉化成Object陣列,則對Object陣列的每一項進行強制型別的轉化,則可以完成處理:

String hql="SELECT t.username,count(*) FROM Testtable t group by t.username having count(*)>1 order by count(*) desc"
List<Object> resultList = session.createQuery(hql).list();
for (int i = 0; i < resultList.size(); i++) {
	Object[] obj = (Object[])resultList.get(i);
	System.out.println(obj[0]+","+obj[1]);
}
這裡利用了純粹的HQL查詢,也省略Hibernate的初始化與配置等。如果你要利用到查詢結果做後續工作,

則可以,這樣處理:

String username=(String)obj[0];
可以看出,HQL語句其實與SQL沒有什麼差別,SQL的所有關鍵字在HQL裡面都是存在的,只是有少許改變,

關鍵是,在要查詢的類中,後面補一個替換名稱,比如Testtable就替換為t,就可以順利操作了。

上述省略整個HQL初始化與佈置的過程,具體請看《【Hibernate】Hibernate的層次劃分,Hibernate4.3的初始化的新寫法》(點選開啟連結),不再贅述。

其中,這裡的目錄結構是這樣的:


其中,

dbDAO.java,資料庫業務類,一字未改,多次複用:

import org.hibernate.*;
import org.hibernate.cfg.*;
import org.hibernate.service.*;
import org.hibernate.boot.registry.*;

public class dbDAO {
	private Session session;

	// 建構函式,初始化Session,相當於連線資料庫
	public dbDAO() {
		//這裡使用了Hibernate4.3.8的寫法,這裡Hibernate又把初始化的方法修改了,非常蛋疼
		Configuration cfg = new Configuration().configure();
		ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
				.applySettings(cfg.getProperties()).build();
		SessionFactory sessionFactory = cfg
				.buildSessionFactory(serviceRegistry);
		this.session = sessionFactory.openSession();
	}
	
	// 執行查詢
	public Query query(String hql){
		return session.createQuery(hql);
	}
	
	// 執行插入、修改
	public void save(Object object){
		Transaction transaction=session.beginTransaction();  
		session.save(object);
		transaction.commit(); 
	}
	
	// 執行刪除
	public void delete(Object object){
		Transaction transaction=session.beginTransaction(); 
		session.delete(object);
		transaction.commit(); 
	}

	// 解構函式,中斷Session,相當於中斷資料庫的連線
	protected void finalize() throws Exception {
		if (session.isConnected() || session != null) {
			session.close();
		}
	}

}
hibernate.cfg.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<!--所用的資料庫驅動  -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<!--所用的資料庫登陸密碼  -->
		<property name="hibernate.connection.password">admin</property>
		<!--所用的資料庫名稱為test,根據實際更改 -->
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
		<!--所用的資料庫使用者名稱  -->
		<property name="hibernate.connection.username">pc</property>
		<!--所用的資料庫方言,與所用資料庫驅動一樣,可以在網上查到,這裡是mysql -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
		<property name="hibernate.format_sql">true</property>
		<!--如果是update表明Hibernate將保留原來的資料記錄,插入時把新記錄新增到已有的表,-->
		<!--如果是create,則總是建立新的表,如果原來資料庫已有的這個表,則這個表的記錄會被全部清洗  -->
		<property name="hibernate.hbm2ddl.auto">update</property>
		<!--羅列Testtable表與Java檔案的對映,這裡就Testtable.java的一張表,所以就寫一個Testtable.java  -->
		<mapping class="Testtable" />
	</session-factory>
</hibernate-configuration>
Testtable.java,資料庫持久化類的內容如下,只是把資料庫中的testtable表的所有東西對映過來:
import javax.persistence.*;

@Entity
@Table(name = "testtable")
public class Testtable {
	private int id;
	private String username;
	private String number;
	private String date;
	// 表示主鍵與自動生成項
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	@Column(name = "username")
	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	@Column(name = "number")
	public String getNumber() {
		return number;
	}

	public void setNumber(String number) {
		this.number = number;
	}
		
	@Column(name = "date")
	public String getDate() {
		return date;
	}

	public void setDate(String date) {
		this.date = date;
	}
	

	@Override
	public String toString() {
		return id + "," + username + "," + number + "," + date;
	}

}
最關鍵的是控制層方法實現類,HQL.java,就是把上面所介紹的Hibernate的聚類查詢、分組查詢、排序與時間之差查詢利用dbDAO.java的封裝,一一實現:
import java.util.*;

@SuppressWarnings("unchecked")
public class HQL {
	public static void main(String[] args) {
		// 建立DAO類
		dbDAO db = new dbDAO();
		// 如果返回值是唯一的,則用uniqueResult()方法
		String result = db
				.query("select count(*) from Testtable t where timestampdiff(year,t.date,now())<30")
				.uniqueResult().toString();
		System.out.println(result);
		System.out.println();
		// 排序與聚類查詢(分組查詢)
		List<Object> resultList = db
				.query("SELECT t.username,count(*) FROM Testtable t group by t.username having count(*)>1 order by count(*) desc")
				.list();
		for (int i = 0; i < resultList.size(); i++) {
			Object[] obj = (Object[]) resultList.get(i);
			System.out.println(obj[0] + "," + obj[1]);
		}

	}

}
執行結果如下圖:


相關推薦

HibernateHibernate查詢分組查詢排序時間

在Hibernate中的HQL語句其實能夠基本能夠實現SQL語句所做的事情,正如jQuery至於javascript一樣。雖然HQL語句是對類的查詢,但是HQL在實行聚類查詢、分組查詢、排序與時間之差等查詢,也無須把查詢結果查詢出來,再通過對List的處理才得到結果。 比如

IM關於評價演算法的理解

譜聚類是基於拉普拉斯特徵對映的k近鄰聚類,matlab程式碼如下: >> n=500;c=2;k=10;t=randperm(n);a=linspace(0,2*pi,n/2)'; >> x=[a.*cos(a) a.*sin(a);(a+pi).*cos(a) (a

Matlab層次並繪製氣泡圖

%% 層次聚類 Ncluster=5; %聚類個數 %% data xx=[0.7480 0.3852 1.6347; 0.0232 0.4712 1.5317; 0.5345 1.2082 1.6758; 1.4

轉載(spectral clustering)

1. 譜聚類       給你部落格園上若干個部落格,讓你將它們分成K類,你會怎樣做?想必有很多方法,本文要介紹的是其中的一種——譜聚類。      聚類的直觀解釋是根據樣本間相似度,將它們分成不同組。譜聚類的思想是將樣本看作頂點,樣本間的相似度看作帶權的邊,從而將聚類問題轉為圖分割問題:找到一種圖分割的方

C++Keans演算法的C++實現

Kmeans演算法的實現步驟: 1、從D中隨機取k個元素,作為k個簇的各自的中心。 2、分別計算剩下的元素到k個簇中心的相異度(元素到簇中心的歐氏距離),將這些元素分別劃歸到相異度最低的簇。 3、根據聚類結果,重新計算k個簇各自的中心,計算方法是取簇中所有

hibernatehibernatejpa的@ManyToMany

     需求:一個員工輸入多個部門,一個部門有多個員工,也即員工和部門是多對多的關係。想要生成一張中間表,在hibernate 中需要在2個實體中分別建立對應的關係。     具體實體:@Entity @Getter @Setter @Table(name = "membe

1.27 雜記hibernate的各種查詢方法

1.     使用HQL語句 Query q = session.createQuery("select e from com.sun.demo.Emp e"); 2.     使用Load方法(主鍵查詢) Emp e = (Emp)session.load(Emp.cl

SSHhibernate的源資料配置檔案**.hbm.xml中的entity-name屬性一定要用完整名,即使你用了包!!

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://ww

HibernateHibernate中savepersist和saveOrUpdate有何不同?

http://javarevisited.blogspot.tw/2012/09/difference-hibernate-save-vs-persist-and-saveOrUpdate.html     所有這三個方法,也就是save()、saveOrUpdate()

SSHHibernate中DetachedCriteria設定關聯屬性的查詢條件和獲取關聯屬性結果集的倆個問題!

問題一:Hibernate設定關聯屬性的查詢條件如果我們想要在離線DetachedCriteria中設定物件的關聯屬性物件的非外來鍵屬性的查詢條件,那麼要為關聯屬性設定一個別名!!注意:如果查詢的就是關

Hibernatehibernate框架的搭建

orm 3.1 configure rop height 多個 vax ebe 程序 1, Hibernate 是什麽 Hibernate框架簡化了java應用程序與數據庫交互的開發。 Hibernate是一個開源,輕量級的ORM(對象關系映射)工具。 2,Hibern

HibernateHibernate中使用延遲加載應該註意的事項

取出 struts2 dial 表示 指定 cef init pen ima 1,簡介 在使用一些查詢方法時,方法執行了,但是並沒有立刻發送SQL語句查詢數據庫。而是在訪問對象的getXxx方法時候才觸發SQL執行加載對象數據。這種機制就稱為延遲加載。 2,優點 延

hibernateHibernate SQL 方言(hibernate.dialect)

hibernate where sof nod red poi form sybase ora 參考如下: RDBMSDialect DB2 org.hibernate.dialect.DB2Dialect DB2 AS/400 org.hibernate.d

機器學習---密度從初識到應用

max 一個 eight log div 指定 聚類 空間 mar 一.前述 密度聚類是一種能降噪的算法。 二.相關概念 先看些抽象的概念(官方定義): 1.:對象O的是與O為中心,為半徑的空間,參數,是用戶指定每個對象的領域半徑值。 2.MinPts(領域密度閥值):對象

hibernateHibernate中get()和load()的區別

etime () bsp ava fin null void 自己 IT Hibernate中根據Id單條查詢獲取對象的方式有兩種,分別是get()和load(),來看一下這兩種方式的區別。 1. get() 使用get()來根據ID進行單條查詢: 1

hibernate打印SQL及參數

orm comment binder version engine .org inf 相關 bin 在Hibernate的配置文件hibernate.cfg.xml中有3個設置項跟顯示SQL語句相關,他們的值都是boolean值:1、show_sql:是否顯示SQL語句2、

原創Hibernate自動生成(2)

成了 OS class 項目重構 alt index AS url 改名 本實戰是博主初次學習Java,分析WCP源碼時,學習HibernateTools部分的實戰,由於初次接觸,難免錯誤,僅供參考,希望批評指正。 開發環境: Eclipse Version: Photo

Hibernate持久層框架使用hibernate表關聯

Hibernate配置表關聯的方式 一對一(OneToOne) 例如在一張表中,其中有一個列與另一個表對應,並且是唯一對應的關係時就是一對一關係了,通常我們會將這一列作為外來鍵(資料庫基礎知識),例如新建兩張表,一張company表作為公司表,一張Boss表作為老闆表,因此這裡就是一個公司對

Hibernate持久層框架使用hibernate的常用註解

@DynamicInsert註解 這是一個hibernate對類的註解,用於資料的動態插入,對於持久化類中的屬性是否被賦值來動態生成sql語句 例如下面使用該註解來註解User類 @Entity(name="tb_user") @DynamicInsert(false) public c

Linux檢視日誌命令catlessmoretailhead

目錄 一、cat 二、more 三、less 四、tail 五、head 各命令的主要區別: linux命令中cat、more、less、tail、head均可用來檢視檔案內容,主要區別有: cat是一次性顯示整個檔案的內容,適用於檔案內容少的情況;