【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陣列的每一項進行強制型別的轉化,則可以完成處理:
這裡利用了純粹的HQL查詢,也省略Hibernate的初始化與配置等。如果你要利用到查詢結果做後續工作,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]); }
則可以,這樣處理:
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]);
}
}
}
執行結果如下圖:
相關推薦
【Hibernate】Hibernate的聚類查詢、分組查詢、排序與時間之差
在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個簇各自的中心,計算方法是取簇中所有
【hibernate】hibernate、jpa的@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
【SSH】hibernate的源資料配置檔案**.hbm.xml中的entity-name屬性一定要用完整類名,即使你用了包!!
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://ww
【Hibernate】Hibernate中save、persist和saveOrUpdate有何不同?
http://javarevisited.blogspot.tw/2012/09/difference-hibernate-save-vs-persist-and-saveOrUpdate.html 所有這三個方法,也就是save()、saveOrUpdate()
【SSH】Hibernate中DetachedCriteria設定關聯屬性的查詢條件和獲取關聯屬性結果集的倆個問題!
問題一:Hibernate設定關聯屬性的查詢條件如果我們想要在離線DetachedCriteria中設定物件的關聯屬性物件的非外來鍵屬性的查詢條件,那麼要為關聯屬性設定一個別名!!注意:如果查詢的就是關
【Hibernate】hibernate框架的搭建
orm 3.1 configure rop height 多個 vax ebe 程序 1, Hibernate 是什麽 Hibernate框架簡化了java應用程序與數據庫交互的開發。 Hibernate是一個開源,輕量級的ORM(對象關系映射)工具。 2,Hibern
【Hibernate】Hibernate中使用延遲加載應該註意的事項
取出 struts2 dial 表示 指定 cef init pen ima 1,簡介 在使用一些查詢方法時,方法執行了,但是並沒有立刻發送SQL語句查詢數據庫。而是在訪問對象的getXxx方法時候才觸發SQL執行加載對象數據。這種機制就稱為延遲加載。 2,優點 延
【hibernate】Hibernate 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(領域密度閥值):對象
【hibernate】Hibernate中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】檢視日誌類命令cat、less、more、tail、head
目錄 一、cat 二、more 三、less 四、tail 五、head 各命令的主要區別: linux命令中cat、more、less、tail、head均可用來檢視檔案內容,主要區別有: cat是一次性顯示整個檔案的內容,適用於檔案內容少的情況;