Hibernateä¸çš„Criteria APIæä¾›äº?ji¨£n)å¦ä¸€¿U查询æŒä¹…åŒ–çš„æ–¹æ³•ã€‚å®ƒè®©ä½ èƒ½å¤Ÿä½¿ç”¨½Ž€å•çš„API动æ€çš„æž„徿Ÿ¥è¯¢åQŒå®ƒç‰|´»çš„特性通常用于æœçƒ¦(ch¨³)æ¡äšg的数é‡å¯å˜çš„æƒ…况ã€?br /> Criteria查询之所以絋zÀL˜¯å› 䨓(f¨´)它å¯ä»¥å€ŸåŠ©Javaè¯è¨€,在Java的帮助下它拥有超‘ŠHQL的功能。Criteria查询也是Hibernateç«åŠ›æŽ¨è的一¿Ué¢å‘对象的查询方å¼ã€?br /> Criteria查询的缺点在于åªèƒ½æ£€ç´¢å®Œæ•´çš„对象åQŒä¸æ”¯æŒ¾lŸè®¡å‡½æ•°åQŒå®ƒæœ¬èínçš„API也抬高ä(sh¨´)º†(ji¨£n)一定的å¦ä¹ (f¨¤n)å¡åº¦ã€?/p>
Criteria查询½CÞZ¾‹ä»£ç
Session session=HibernateUtil.getSession();
Criteria criteria=session.createCriteria(User.class);
// æ¡äšg一åQšå¿UîC»¥å…›_¼€å¤?br />
criteria.add(Restrictions.like("name", "å…?"));
// æ¡äšg二:(x¨¬)email出现在数¾l„ä¸
String[] arr={"1@2.3","2@2.3","3@2.3"};
criteria.add(Restrictions.in("email", arr));
// æ¡äšg三:(x¨¬)password½{‰äºŽä¸€
criteria.add(Restrictions.eq("password", "1"));
// æŽ’åºæ¡äšgåQšæŒ‰ç™Õd½•æ—‰™—´å‡åº
criteria.addOrder(Order.asc("lastLoginTime"));
List<User> users=(List<User>)criteria.list();
System.out.println("˜q”回的User实例æ•îCØ“(f¨´)"+users.size());
for(User user:users){
System.out.println(user);
}
HibernateUtil.closeSession(session);
Criteria查询实际产生的SQLè¯å¥
select
this_.ID as ID0_0_,
this_.name as name0_0_,
this_.pswd as pswd0_0_,
this_.email as email0_0_,
this_.lastLoginTime as lastLogi5_0_0_,
this_.lastLoginIp as lastLogi6_0_0_
from
USERTABLE_OKB this_
where
this_.name like 'å…?'
and this_.email in (
'1@2.3', '2@2.3', '3@2.3'
)
and this_.pswd='1'
order by
this_.lastLoginTime asc
注:(x¨¬)傿•°æ˜¯æ‰‹å·¥åŠ ä¸Šçš„ã€?br />
Hibernateä¸ä¸ä½¿ç”¨SQL而是有自å·Þqš„é¢å‘对象查询è¯è¨€,该è¯a€å䨓(f¨´)Hibernate查询è¯è¨€(Hibernate Query Language).HQL被有æ„设计戾cÖM¼¼SQL,˜q™æ ·å¼€å‘äh员å¯ä»¥åˆ©ç”¨å·²æœ‰çš„SQL知识,é™ä½Žå¦ä¹ (f¨¤n)å¡åº¦.它支æŒå¸¸ç”¨çš„SQLç‰ÒŽ(gu¨©)€?˜q™äº›ç‰ÒŽ(gu¨©)€§è¢«ž®è£…æˆé¢å‘对象的查询è¯è¨€,从柿Uæ„义上æ¥è¯´,ç”±HQL是é¢å‘对象的,å› æ¤æ¯”SQL更容易编å†?
本文ž®†é€æ¸ä»‹ç»HQL的特æ€?
查询数æ®åº“䏿‰€æœ‰å®žä¾?/strong>
è¦å¾—到数æ®åº“䏿‰€æœ‰å®žä¾?HQL写䨓(f¨´)”from 对象å?#8221;å›_¯,ä¸éœ€è¦selectåå¥,当然更ä¸éœ€è¦Whereåå¥.代ç 如å³.
Query query=session.createQuery("from User");
List<User> users=(List<User>)query.list();
for(User user:users){
System.out.println(user);
}
é™åˆ¶˜q”回的实例数
讄¡½®æŸ¥è¯¢çš„maxResults属性å¯é™åˆ¶˜q”回的实ä¾?记录)æ•?代ç 如å³:
Query query=session.createQuery("from User order by name");
query.setMaxResults(5);
List<User> users=(List<User>)query.list();
System.out.println("˜q”回的User实例æ•îCØ“(f¨´)"+users.size());
for(User user:users){
System.out.println(user);
}
分页查询
分页是Webå¼€å‘的常è§è¯ùN¢˜,æ¯ç§æ•°æ®åº“都有自å·Þq‰¹å®šçš„分页æ–ÒŽ(gu¨©)¡ˆ,从简å•åˆ°å¤æ‚都有.在Hibernateä¸åˆ†™åµé—®é¢˜å¯ä»¥é€šè¿‡è®„¡½®firstResultå’ŒmaxResultè½ÀL¾çš„è§£å†?
代ç 如å³:
Query query=session.createQuery("from User order by name");
query.setFirstResult(3);
query.setMaxResults(5);
List<User> users=(List<User>)query.list();
System.out.println("˜q”回的User实例æ•îCØ“(f¨´)"+users.size());
for(User user:users){
System.out.println(user);
}
æ¡äšg查询
æ¡äšg查询åªè¦å¢žåŠ Whereæ¡äšgå›_¯.
代ç 如å³:
Hibernate䏿¡ä»¶æŸ¥è¯¢çš„å®žçŽ°æ–¹å¼æœ‰å¤š¿U?˜q™ç§æ–¹å¼çš„优点在于能昄¡¤ºå®Œæ•´çš„SQLè¯å¥(åŒ…æ‹¬å‚æ•°)如下.
select
user0_.ID as ID0_,
user0_.name as name0_,
user0_.pswd as pswd0_,
user0_.email as email0_,
user0_.lastLoginTime as lastLogi5_0_,
user0_.lastLoginIp as lastLogi6_0_
from
USERTABLE_OKB user0_
where
user0_.name like 'ä½?'
public static void fetchByName(String prefix){
Session session=HibernateUtil.getSession();
Query query=session.createQuery("from User where name like'"+prefix+"%'");
List<User> users=(List<User>)query.list();
System.out.println("˜q”回的User实例æ•îCØ“(f¨´)"+users.size());
for(User user:users){
System.out.println(user);
}
HibernateUtil.closeSession(session);
}
ä½ç½®å‚æ•°æ¡äšg查询
HQLä¸ä¹Ÿå¯ä»¥è±¡jdbcä¸PreparedStatementä¸€æ ·äØ“(f¨´)SQL讑֮šå‚æ•°,但ä¸åŒçš„æ˜¯ä¸‹æ ‡ä»Ž0å¼€å§?
代ç 如å³:
public static void fetchByPos(String prefix){
Session session=HibernateUtil.getSession();
Query query=session.createQuery("from User where name=?");
// 注æ„ä¸‹æ ‡æ˜¯ä»Ž0å¼€å§?å’Œjdbcä¸PreparedStatementä»?开始ä¸å?br />
query.setParameter(0, prefix);
List<User> users=(List<User>)query.list();
System.out.println("˜q”回的User实例æ•îCØ“(f¨´)"+users.size());
for(User user:users){
System.out.println(user);
}
HibernateUtil.closeSession(session);
}
命å傿•°æ¡äšg查询
使用ä½ç½®å‚æ•°æ¡äšg查询最大的ä¸ä¾¿åœ¨äºŽä¸‹æ ‡ä¸?å·ä½¾|®çš„对应ä¸?å¦‚æžœå‚æ•°è¾ƒå¤šå®ÒŽ(gu¨©)˜“坯D‡´é”™è¯¯.˜q™æ—¶é‡‡ç”¨å‘½å傿•°æ¡äšg查询更好.
使用命å傿•°æ—¶æ— éœ€çŸ¥é“æ¯ä¸ªå‚数的烦(ch¨³)引佾|?˜q™æ ·ž®±å¯ä»¥èŠ‚çœå¡«å……æŸ¥è¯¢å‚æ•°çš„æ—‰™—´.
如果有一个命å傿•°å‡ºçŽ°å¤š‹Æ?那在æ¯ä¸ªåœ°æ–¹éƒ½ä¼š(x¨¬)讄¡½®å®?
public static void fetchByNamedParam(){
Session session=HibernateUtil.getSession();
Query query=session.createQuery("from User where name=:name");
query.setParameter("name", "æŽç™½");
List<User> users=(List<User>)query.list();
System.out.println("˜q”回的User实例æ•îCØ“(f¨´)"+users.size());
for(User user:users){
System.out.println(user);
}
HibernateUtil.closeSession(session);
}
å‘½åæŸ¥è¯¢
å‘½åæŸ¥è¯¢æ˜¯åµŒåœ¨XMLæ˜ å°„æ–‡äšgä¸çš„æŸ¥è¯¢ã€‚通常åQŒå°†¾l™å®šå¯¹è±¡çš„æ‰€æœ‰æŸ¥è¯¢éƒ½æ”‘Öœ¨åŒä¸€æ–‡äšgä¸ï¼Œ˜q™ç§æ–¹å¼å¯ä‹É¾l´æŠ¤ç›¸å¯¹å®ÒŽ(gu¨©)˜“äº›ã€‚å‘½åæŸ¥è¯¢è¯å¥å†™åœ¨æ˜ ž®„定义文件的最åŽé¢ã€?/p>
执行代ç 如下åQ?br /> Session session=HibernateUtil.getSession();
Query query=session.getNamedQuery("user.sql");
List<User> users=(List<User>)query.list();
System.out.println("˜q”回的User实例æ•îCØ“(f¨´)"+users.size());
for(User user:users){
System.out.println(user);
}
HibernateUtil.closeSession(session);
æ˜ å°„æ–‡äšg节选:(x¨¬)
<hibernate-mapping package="org.hibernate.auction">
<class name="com.sitinspring.domain.User"
table="USERTABLE_OKB" lazy="false">
<id name="id" column="ID" >
<generator class="uuid.hex"/>
</id>
<property name="name" column="name" />
<property name="password" column="pswd" />
<property name="email" column="email" />
<property name="lastLoginTime" column="lastLoginTime" />
<property name="lastLoginIp" column="lastLoginIp" />
</class>
<query name="user.sql">
<![CDATA[from User where email='2@2.3']]>
</query>
</hibernate-mapping>
本文å‡å®šè¯»è€…å·²¾l熟知以下知è¯?/p>
能够熟练使用JDBC创å¾Java应用½E‹åºåQ?br /> 创徘q‡ä»¥æ•°æ®åº“䨓(f¨´)ä¸å¿ƒ(j¨©)的应ç”?br /> ç†è§£åŸºæœ¬çš„å…³¾pȆ论和¾l“构化查询è¯a€SQL åQˆStrutured Query LanguageåQ?/p>
Hibernate
Hibernate是一个用于开å‘Java应用的对è±?å…³ç³»æ˜ å°„æ¡†æž¶ã€‚å®ƒé€šè¿‡åœ¨æ•°æ®åº“ä¸äØ“(f¨´)å¼€å‘äh员å˜å‚¨åº”用对象,在数æ®åº“和应用之间æä¾›äº†(ji¨£n)一座桥æ¢ï¼Œå¼€å‘äh员ä(sh¨´)¸å¿…编写大é‡çš„ä»£ç æ¥å˜å‚¨å’Œ‹‚€(g¨¨)索对象,çœä¸‹æ¥çš„¾_‘ÖŠ›æ›´å¤šçš„æ”¾åœ¨é—®é¢˜æœ¬íw«ä¸Šã€?/p>
æŒä¹…化与关系数æ®åº?/strong>
æŒä¹…化的常è§å®šä¹‰åQšä‹Éæ•°æ®çš„å˜?g¨°u)zÀL—¶é—´è¶…˜q‡åˆ›å»ø™¯¥æ•°æ®çš„è¿›½E‹çš„å˜æ´»æ—‰™—´ã€‚æ•°æ®æŒä¹…化åŽå¯ä»¥é‡æ–°èŽ·å¾—å®ƒåQ›å¦‚果外界进½E‹æ²¡æœ‰ä¿®æ”¹å®ƒåQŒå®ƒ?y¨u)®†ä¸ŽæŒä¹…化之å‰ç›¸åŒã€‚对于一般应用æ¥è¯ß_(d¨¢)¼ŒæŒä¹…化指的是ž®†æ•°æ®å˜å‚¨åœ¨å…³ç³»æ•°æ®åº“ä¸ã€?br /> 关系数æ®åº“æ˜¯ä¸ºç®¡ç†æ•°æ®è€Œè®¾è®¡çš„åQŒå®ƒåœ¨å˜å‚¨æ•°æ®æ–¹é¢å¾ˆ‹¹è¡ŒåQŒè¿™ä¸»è¦å½’功于易于ä‹É用SQLæ¥åˆ›å»ºå’Œè®‰K—®ã€?br /> 关系数æ®åº“ä‹É用的模型被称为关¾pÀL¨¡åž‹ï¼Œå®ƒä‹É用二¾l´è¡¨æ¥è¡¨½Cºæ•°æ®ã€‚è¿™¿Uæ•°æ®é€»è¾‘视图表示äº?ji¨£n)用户如何看待包å«çš„æ•°æ®ã€‚表å¯ä»¥é€šè¿‡ä¸È 和外ç 相互关è”。主ç å”¯ä¸€çš„æ ‡è¯†äº†(ji¨£n)表ä¸çš„ä¸€è¡Œï¼Œè€Œå¤–ç æ˜¯å¦ä¸€ä¸ªè¡¨ä¸çš„ä¸È ã€?/p>
对象/关系é˜ÀLŠ—ä¸åŒ¹é…?/strong>
关系数æ®åº“æ˜¯ä¸ºç®¡ç†æ•°æ®è®¾è®¡çš„åQŒå®ƒé€‚åˆäºŽç®¡ç†æ•°æ®ã€‚然而,在é¢å‘对象的应用ä¸ï¼Œž®†å¯¹è±¡æŒä¹…化为关¾pÀL¨¡åž‹å¯èƒ½ä¼š(x¨¬)é‡åˆ°é—®é¢˜ã€‚这个问题的æ ÒŽ(gu¨©)ºæ˜¯å› 为关¾pÀL•°æ®åº“½Ž¡ç†æ•°æ®åQŒè€Œé¢å‘å¯¹è±¡çš„åº”ç”¨æ˜¯äØ“(f¨´)业务问题建模而设计的。由于这两ç§ç›®çš„ä¸åŒåQŒè¦ä½¿è¿™ä¸¤ä¸ªæ¨¡åž‹ååŒå·¥ä½œå¯èƒ½å…ähœ‰æŒ?xi¨§)战性。这个问题被¿UîCØ“(f¨´) 对象/关系é˜ÀLŠ—ä¸åŒ¹é…(Object/relational impedance mismatchåQ‰æˆ–½Ž€¿UîCØ“(f¨´)é˜ÀLŠ—ä¸åŒ¹é…?/p>
é˜ÀLŠ—ä¸åŒ¹é…çš„å‡ ä¸ªå…¸åž‹æ–šw¢
在应用ä¸è½ÀL˜“å®žçŽ°çš„å¯¹è±¡ç›¸åŒæˆ–相ç‰åQŒè¿™æ ïL(f¨¥ng)š„关系在关¾pÀL•°æ®åº“ä¸ä¸å˜åœ¨ã€?br /> 在é¢å‘对象è¯a€çš„一™åÒŽ(gu¨©) ¸å¿?j¨©)特性是¾l§æ‰¿åQŒç‘ô承很é‡è¦åQŒå› 为它å…许创å¾é—®é¢˜çš„ç²¾¼‹®æ¨¡åž‹ï¼ŒåŒæ—¶å¯ä»¥åœ¨å±‚‹Æ¡ç»“æž„ä¸è‡ªä¸Šè€Œä¸‹çš„å…±äº«å±žæ€§å’Œè¡ŒäØ“(f¨´)。而关¾pÀL•°æ®åº“䏿”¯æŒç‘ô承的概念ã€?br /> 对象之间å¯ä»¥è½ÀL˜“的实çŽîC¸€å¯¹ä¸€åQŒä¸€å¯¹å¤šå’Œå¤šå¯¹å¤šçš„å…³è”å…³¾p»ï¼Œè€Œæ•°æ®åº“òq¶ä¸ç†è§£˜q™äº›åQŒå®ƒåªçŸ¥é“å¤–ç æŒ‡å‘主ç ã€?/p>
对象/å…³ç³»æ˜ å°„
å‰é¡µåˆ—ä‹Däº?ji¨£n)一些阻抗ä¸åŒšw…的问题,当然开å‘äh员是å¯ä»¥è§£å†³˜q™äº›é—®é¢˜åQŒä½†˜q™ä¸€˜q‡ç¨‹òq¶ä¸å®ÒŽ(gu¨©)˜“。对è±?å…³ç³»æ˜ å°„åQˆObject/Relational MappingåQ‰å°±æ˜¯äØ“(f¨´)解决˜q™äº›é—®é¢˜è€Œå¼€å‘çš„ã€?br /> ORM在对象模型和关系模型之间架è“väº?ji¨£n)一座桥æ¢ï¼Œè®©åº”用能够直接æŒä¹…化对象åQŒè€Œä¸è¦æ±‚在对象和关系之间˜q›è¡Œè½¬æ¢ã€‚Hibernatež®±æ˜¯ORM工具䏿œ€æˆåŠŸçš„ä¸€¿U。它的主è¦ä¼˜ç‚ÒŽ(gu¨©)˜¯½Ž€å•,ç‰|´»åQŒåŠŸèƒ½å®Œå¤‡å’Œé«˜æ•ˆã€?/p>
Hibernate的优点之一åQšç®€å?/strong>
Hibernateä¸åƒæœ‰äº›æŒä¹…åŒ–æ–¹æ¡ˆé‚£æ ·éœ€è¦å¾ˆå¤šçš„¾cÕd’Œé…置属性,它åªéœ€è¦ä¸€ä¸ªè¿è¡Œé˜¶ŒDµé…¾|®æ–‡ä»¶å·²¾l䨓(f¨´)æ¯ä¸ªè¦æŒä¹…化的应用对象指定一个XMLæ ¼å¼çš„æ˜ ž®„文件ã€?br /> æ˜ å°„æ–‡äšgå¯ä»¥å¾ˆçŸåQŒè®©æ¡†æž¶å†›_®šæ˜ 射的其它内容,也å¯ä»¥é€šè¿‡åˆ¶å®šé¢å¤–的属性,如属性的å¯é€‰åˆ—åï¼Œå‘æ¡†æž¶æä¾›æ›´å¤šä¿¡æ¯ã€‚如å›_°±æ˜¯ä¸€ä¸ªæ˜ ž®„文档的½CÞZ¾‹ã€?/p>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.hibernate.auction">
<class name="com.sitinspring.domain.User"
table="USERTABLE_OKB" lazy="false">
<id name="id" column="ID" >
<generator class="uuid.hex"/>
</id>
<property name="name" column="name" />
<property name="password" column="pswd" />
<property name="email" column="email" />
<property name="lastLoginTime" column="lastLoginTime" />
<property name="lastLoginIp" column="lastLoginIp" />
</class>
</hibernate-mapping>
Hibernate的优点之二:(x¨¬)功能完备
Hibernateæ”¯æŒæ‰€æœ‰çš„é¢å‘对象ç‰ÒŽ(gu¨©)€§ï¼ŒåŒ…括¾l§æ‰¿åQŒè‡ªå®šä¹‰å¯¹è±¡¾cÕdž‹å’Œé›†åˆã€‚它å¯ä»¥è®©ä½ åˆ›å¾æ¨¡åž‹æ—¶ä¸å¿…考虑æŒä¹…å±‚çš„å±€é™æ€§ã€?br /> Hibernateæä¾›äº?ji¨£n)一个å为HQL的查询è¯a€åQŒå®ƒä¸ŽSQLéžå¸¸ç›æ€¼¼åQŒåªæ˜¯ç”¨å¯¹è±¡å±žæ€§å代替äº?ji¨£n)表的列。很多通过SQL实现的常用功能都能用HQL实现ã€?/p>
Hibernate的优点之三:(x¨¬)高效
Hibernateä½¿ç”¨æ‡’æƒ°åŠ è²æé«˜?sh¨´)º†(ji¨£n)性能åQŒåœ¨Hibernateòq¶ä¸åœ¨åŠ è½½çˆ¶å¯¹è±¡æ—¶å°±åŠ è²å¯¹è±¡é›†åˆåQŒè€Œåªåœ¨åº”用需è¦è®¿é—®æ—¶æ‰ç”Ÿæˆã€‚è¿™ž®±é¿å…了(ji¨£n)‹‚€(g¨¨)ç´¢ä¸å¿…è¦çš„对象而媄(ji¨£ng)哿€§èƒ½ã€?br /> Hibernateå…许‹‚€(g¨¨)索主对象旉™€‰æ‹©æ€§çš„¼›æ¢‹‚€(g¨¨)索关è”的对象åQŒè¿™ä¹Ÿæ˜¯ä¸€™åÒŽ(gu¨©)”¹å–„性能的特性ã€?br /> 对象¾~“å˜åœ¨æé«˜åº”用性能斚w¢ä¹Ÿå‘挥了(ji¨£n)很大的作用。Hibernate支æŒå„ç§å¼€æºå’Œ¾~“å˜?sh¨´)º§å“åQŒå¯ä¸ºæŒä¹…化¾cÀLˆ–æŒä¹…化对象集åˆå¯ç”¨ç¼“å˜ã€?/p>
æ€È»“
在åŒä¸€æ€§ï¼Œ¾l§æ‰¿å’Œå…³è”三斚w¢åQŒå¯¹è±¡æ¨¡åž‹å’Œå…³ç³»æ¨¡åž‹å˜åœ¨ç€é˜ÀLŠ—ä¸åŒ¹é…,˜q™æ˜¯ä¼—多ORM框架致力解决的问题,hibernateæ˜¯è¿™äº›æ–¹æ¡ˆä¸æœ€æˆåŠŸçš„ä¸€ä¸ªï¼Œå®ƒçš„ä¸»è¦ä¼˜ç‚¹æ˜¯ç®€å•,ç‰|´»åQŒåŠŸèƒ½å®Œå¤‡å’Œé«˜æ•ˆã€?br />
使用Hibernateä¸è¦æ±‚é¢†åŸŸå¯¹è±¡å®žçŽ°ç‰¹åˆ«çš„æŽ¥å£æˆ–ä‹É用应用æœåС噍åQŒå®ƒæ”¯æŒé›†åˆåQŒç‘ô承,自定义数æ®ç±»åž‹ï¼Œòq¶æºå¸¦ä¸€¿U强大的查询è¯è¨€HQLåQŒèƒ½å‡å°‘很多æŒä¹…化方é¢çš„工作é‡ï¼Œä½¿ç¨‹åºå‘˜èƒ½æŠŠæ›´å¤š¾_‘ÖŠ›è½¬ç§»åˆ°é—®é¢˜æœ¬íw«ä¸Šæ¥ã€?/p>