使用Hibernate的JPA 2.0标准查询
生活随笔
收集整理的這篇文章主要介紹了
使用Hibernate的JPA 2.0标准查询
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
JPA 2.0中引入了條件查詢 。 借助條件查詢,您可以以類型安全的方式編寫查詢。 在進行標準查詢之前,開發人員必須通過構建基于對象的查詢定義來編寫查詢。 構建查詢時,可能會出現語法錯誤的情況。 條件查詢API提供了創建具有編譯時安全性的結構化和嵌套查詢的功能。 進入有關標準查詢的更多理論可能不是一個好主意,因為可以在網上找到大量相同的頁面。 讓我們舉一個簡單的例子來了解使用條件查詢的查詢。 在這篇文章中,我將Hibernate作為JPA 2.0的供應商來展示Criteria Query的示例。 在深入探討標準查詢之前,讓我們考慮一下可以表示為實體的數據庫表和相應的Java類: 狀態[stateId,stateName] 城市[cityId,stateId(FK#),CityName] 我們要獲取特定州的城市列表,在該州中,城市名稱應從“ M”開始,城市列表應按升序排列。 如果我們考慮簡單的本機SQL,則如下所示: Select * from City c, State s where c.stateId = s.stateId and c.stateId = ? and c.cityName like "M%" order by c.cityName
數據庫表:
例如,下面有兩個數據庫表:
JPA實體:
以下是配置為JPA實體以表示州和城市表的兩個Java類。 這些也可以使用逆向工程工具生成。STATE表的Java實體
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.OneToMany; import javax.persistence.Table; import java.util.Date; import java.util.Set; import javax.persistence.SequenceGenerator;@Entity @Table(name="STATE") @SequenceGenerator(sequenceName="STATE_SEQ",name="STATE_SEQ_GEN") public class State {private Long stateId;private String stateName;private Set citySet;@Id@Column(name="stateId")@GeneratedValue(generator="STATE_SEQ_GEN",strategy=GenerationType.SEQUENCE)public Long getStateId;() {return stateId;}public void setId(long stateId) {stateId = stateId;}@Column(name="stateName")public String getStateName() {return stateName;}public void setStateName(String stateName) {this.stateName = stateName;}public void setCitySet(Set citySet)this.citySet= citySet;}@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL,mappedBy="state")public Set getCitySet() {return citySet;} }CITY表的Java實體
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.ManyToOne; import javax.persistence.SequenceGenerator; import javax.persistence.Table;@Entity @Table(name="CITY") @SequenceGenerator(sequenceName="CITY_SEQ",name="CITY_SEQ_GEN") public class City {private Long cityId;private String cityName;private State state;public void setId(long cityId) {this.cityId = cityId;}@Id@Column(name="CityId")@GeneratedValue(generator="CITY_SEQ_GEN",strategy=GenerationType.SEQUENCE)public Long getCityId() {return cityId;}@Column(name="CityName")public void setContent(String cityName) {this.cityName = cityName;}public String getCityName() {return cityName;}public void setState(State state) {this.state = state;}@ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name = "STATEID", nullable = false)public state getState() {return state;} }值對象(PO??JO):
以下是兩個值對象。 借助條件查詢,您可以直接從結果數據映射值對象。 您無需編寫代碼即可將結果數據從實體類復制到value對象。 這確實是條件查詢中令人興奮的功能。 public class StateVO {private Long stateId;private String stateName;private Set cityVOSet;// All getter setters} public class CityVO {private Long cityId;private String cityName;private StateVO stateVO;public CityVO( Long cityId, String cityName){this.cityId=cicityId;this.cityName=cityName;}// All getter setters }DAO實施:
現在是時候使用標準查詢來獲取數據了。 我們將公開一個將輸入參數作為StateVO并返回CityVO列表的方法。 import javax.persistence.EntityManager;import javax.persistence.EntityManagerFactory;import javax.persistence.Persistence;public class StateCityDAOImpl{public List getCityList(StateVO searchStateVO) {// Get the entity manager instanceEntityManagerFactory emf = Persistence.createEntityManagerFactory("StateCityService");EntityManager entityManager= emf.createEntityManager();// Get the criteria builder instance from entity managerfinal CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();// Create criteria query and pass the value object which needs to be populated as resultfinal CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(CityVO.class);// Tell to criteria query which tables/entities you want to fetch// To join the City and State tables, we need to write below codefinal Root stateRoot = criteriaQuery.from(State.class);final Root cityRoot = criteriaQuery.from(City.class);// Time to define where clause in terms of Predicates// This list will contain all Predicates (where clauses)List criteriaList = new ArrayList();// Note: Ensure that whatever string you are passing in root variables// It should be matched with variables' name in entity classes// [1] where condition: State.StateId = City.StateIdPredicate predicate1 = criteriaBuilder.equal(cityRoot. get("state"). get("stateId"),stateRoot. get("stateId"));criteriaList.add(predicate1);// [2] where condition: City.StateId = ?if (searchStateVO.getStateId() != null) {Predicate predicate2= criteriaBuilder.equal(cityRoot. get("state"). get("stateId"),searchStateVO.getStateId());criteriaList.add(predicate2);}// [3] where condition: City.cityName like 'M%'Predicate predicate3= criteriaBuilder.like(criteriaBuilder.upper(cityRoot. get("cityName")),"M%");criteriaList.add(predicate3); // This statement maps your CityVO with result data// You have to have a custom constructor in CityVO (see above) to populate the result data criteriaQuery.select(criteriaBuilder.construct(CityVO.class, cityRoot. get("cityId"),cityRoot. get("cityName")));// Pass the criteria list to the where method of criteria querycriteriaQuery.where(criteriaBuilder.and(criteriaList.toArray(new Predicate[0])));// Order by clause based on city namescriteriaQuery.orderBy(criteriaBuilder.asc(cityRoot. get("cityName")));// Here entity manager will create actual SQL query out of criteria queryfinal TypedQuery query = entityManager.createQuery(criteriaQuery);// This code can be used to define the row range to fetch the result/* if (CitySize != 0) {query.setFirstResult(startIndex); // starting row indexquery.setMaxResults(endIndex); // end row index}*/return query.getResultList();} 現在我們有了CityVO清單作為您的答案。 我們可以根據上述要求訪問相應的城市名稱。 雖然,使用條件查詢編寫查詢可能有點笨拙,但是一旦使用方便,您就會喜歡“條件查詢”。參考:我們的JCG合作伙伴 Narendra Verma在NS.Infra博客上的《 使用Hibernate進行JPA 2.0標準查詢》 。
翻譯自: https://www.javacodegeeks.com/2013/04/jpa-2-0-criteria-query-with-hibernate.html
總結
以上是生活随笔為你收集整理的使用Hibernate的JPA 2.0标准查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ddos防护厂家(抗ddos产品硬件设备
- 下一篇: linux分区安装类型(linux分区安