通过示例Hibernate–第2部分(DetachedCriteria)
您可以從此處下載工作示例。
在此示例中,我們僅考慮兩個實體。 復仇者聯盟和反派。 我們使用聯接表在兩者之間建立關系。 讓我們看一下此示例中使用的域映射。
package com.avengers.domain;import java.io.Serializable; import java.util.ArrayList; import java.util.List;import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.OneToMany; import javax.persistence.Table;import org.hibernate.annotations.Type;/*** The domain class representing each member of the avengers* * @author Dinuka.Arseculeratne* */ @Entity @Table(name = "Avengers") public class Avenger implements Serializable {/*** The primary key of the Avenger table*/@Id@GeneratedValue(strategy = GenerationType.AUTO)@Column(name = "avenger_id")private Long avengerId;/*** The name of the avenger member*/@Column(name = "avenger_name")private String avengerName;/*** A flag which holds whether the avenger's powers are awesome*/@Type(type = "yes_no")@Column(name = "is_awesome")private boolean isAwesome;/*** The list of enemies the avenger has*/@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)@JoinTable(name = "AVENGERS_AND_VILLAINS", joinColumns = { @JoinColumn(name = "avenger_id") }, inverseJoinColumns = { @JoinColumn(name = "villain_id") })private List<Villain> enemyList = new ArrayList<Villain>();public Long getAvengerId() {return avengerId;}public void setAvengerId(Long avengerId) {this.avengerId = avengerId;}public String getAvengerName() {return avengerName;}public void setAvengerName(String avengerName) {this.avengerName = avengerName;}public boolean isAwesome() {return isAwesome;}public void setAwesome(boolean isAwesome) {this.isAwesome = isAwesome;}public List<Villain> getEnemyList() {return enemyList;}public void addEnemy(Villain enemy) {enemyList.add(enemy);}@Overridepublic String toString() {return "Avenger [avengerId=" + avengerId + ", avengerName="+ avengerName + ", isAwesome=" + isAwesome + ", enemyList="+ enemyList + "]";}}此類映射一個復仇者。 為了使本示例盡可能簡單和簡短,我使用了最少的字段。 惡棍域如下所示;
package com.avengers.domain;import java.io.Serializable;import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table;import org.hibernate.annotations.Type;/*** This class represents the Villain forces against the avengers* * @author Dinuka.Arseculeratne* */ @Entity @Table(name = "Villains") public class Villain implements Serializable {/*** The primary key of the Enemy table*/@Id@GeneratedValue(strategy = GenerationType.AUTO)@Column(name = "villain_id")private Long villaiId;/*** The name of the enemy*/@Column(name = "villain_name")private String villainName;/*** A flag which checks whether the villain is super awesome*/@Type(type = "yes_no")@Column(name = "is_awesome")private boolean isAwesome;public Long getVillaidId() {return villaiId;}public void setVillaidId(Long villaidId) {this.villaiId = villaidId;}public String getVillainName() {return villainName;}public void setVillainName(String villainName) {this.villainName = villainName;}public boolean isAwesome() {return isAwesome;}public void setAwesome(boolean isAwesome) {this.isAwesome = isAwesome;}@Overridepublic String toString() {return "Villain [villaiId=" + villaiId + ", villainName=" + villainName+ ", isAwesome=" + isAwesome + "]";}}好的,現在我們已經定義了域,讓我們看看如何使用DetachedCriteria進行數據檢索。 我在這里使用了DetachedCriteria,因為復仇者聯盟非常具體,并說他們不希望與Hibernate會話有關 ,因此我使用了DetachedCriteria,它不需要出現Hibernate會話。
我們的主要目標是找回小人所屬的《復仇者聯盟》。 請注意,這假設同一個小人不能是多個超級英雄的小人。 因此,我在下面給出了根據傳遞的反派名稱檢索復仇者的方法。
public Avenger retrieveAvengerByVillainName(String villainName) {Avenger avenger = null;/*** Selected a detached criteria so we do not need a session to run it* within.*/DetachedCriteria criteria = DetachedCriteria.forClass(Avenger.class);/*** Here we are doing an inner join with the Villain table in order to do* a name comparison with the villainName passed in as a method* parameter*/DetachedCriteria villainCriteria = criteria.createCriteria("enemyList");villainCriteria.add(Restrictions.eq("villainName", villainName));villainCriteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);@SuppressWarnings("unchecked")List<Avenger> avengerList = getHibernateTemplate().findByCriteria(criteria);if (!avengerList.isEmpty()) {avenger = avengerList.get(0);getHibernateTemplate().initialize(avenger.getEnemyList());}return avenger;}在此方法中,我們要做的是首先為主類創建一個條件,在本例中為Avenger.class 。 然后,我們需要與Villain表進行聯接,因此,我們將使用我們在Avenger域類中定義的列表名稱,從主要條件中創建一個子條件。
然后,將反派域名的屬性與傳入的反派名字相等即可。
Criteria API的強大功能使您可以輕松創建動態查詢,如果我們要使用純HQL,這將很麻煩,而純HQL需要大量的字符串連接才能實現。
附帶了一個名為AvengerTest.java的示例測試類,其附件位于最頂部。 請注意,您需要刪除avenger-context.xml上的注釋,以便創建此示例所需的表。
就是這樣。
復仇者聯盟現在可以避免冒險,因為他們擁有一個系統,可以將任何超級反派與聯盟中的超級英雄聯系起來。
一如既往地歡迎和贊賞您的意見和建議。
感謝您抽出寶貴的時間閱讀!!!!
參考:“ 通過示例進行Hibernate–第2部分(DetachedCriteria)”,來自JCG合作伙伴 Dinuka Arseculeratne ,來自“ 我的旅程” IT博客。
相關文章 :- 通過示例Hibernate–第1部分(刪除孤兒)
- Hibernate陷阱
- Hibernate自動提交命令強制MySQL在過多的磁盤I / O中運行
- DataNucleus 3.0與Hibernate 3.5
- Hibernate映射集合性能問題
- Spring MVC3 Hibernate CRUD示例應用程序
- Java教程和Android教程列表
翻譯自: https://www.javacodegeeks.com/2011/11/hibernate-by-example-part-2.html
總結
以上是生活随笔為你收集整理的通过示例Hibernate–第2部分(DetachedCriteria)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《痞子衡嵌入式半月刊》 第 12 期
- 下一篇: 简述GPS,GSM,GPRS和GNSS的