Hibernate的检索方式Hibernate的检索方?
1.D对象图检索方?br />
Ҏ已经加蝲的对?D到其他对?
2.OID索方?br />
按照对象的OID来检索对?br />
3.HQL索方?br />
使用面向对象的HQL查询语言.
4.QBC索方?br />
使用QBC API来检索对?q种API装了基于字W串形式的查询语?提供了更加面向对象的接口.
它主要由Criteria接口,Criterion接口和Expressioncȝ?它支持在q行时动态生成的查询语句:
以下E序代码用于索姓名以字符"T"开?q且q龄?1的Customer对象:
///调用Session的createCriteria()Ҏ创徏一个Criteria对象
Creteria criteria=session.createCriteria(Customer.class);
//讄查询条g,ExpressioncL供了一pd用于讑֮查询条g的静态方?q些静态方法都
q回Criterion实例,每个Criterion实例代表一个查询条?br />
Criterion criterion1=Expression.like("name","T%");
Criterion criterion2=Expression.eq("age",new Integer(21));
////Criteria的add()Ҏ用于加入查询条g.
criteria=criteria.add(criterion1);
criteria=criteria.add(criterion2);
/////调用Criteria的list()Ҏ执行查询语句,该方法返回Listcd的查询结?在List集合中存?br />
了符合查询条件的持久化对?br />
List result=criteria.list();
对于以上代码执行的SQL语句?select * from CUSTOMERS where NAME like"T%" and AGE=21;
Criteria接口支持Ҏ铄E风?它的add()Ҏq回自n实例,而不是返回voidcd
5.本地SQL索方?
6.QBE索方?
它是QBC的子功能,QBE允许先创Z个对象样?然后索出所有和q个h相同的对?如下:
//创徏一个CUstomerh对象
Customer exampleCustomer=new Customer();
exampleCustoemr.setAge(21);
List result=session.createCriteria(Custoemr.class).add(Example.create(exampleCustomer)).list();
因ؓQBE只支?="?like"比较q算W?所以一般采用HQL索方式或者QBC索方?
分页查询:
Query和Criteria接口都提供了用于分页昄查询l果的方?
setFirstResult(int firstResult):讑֮从哪一个对象开始检?参数firstResult表示q个对象在查询结果中的烦引位|?索引位置的v始gؓ0,
在默认情况下,Query和Criteria接口从查询结果中的第一个对?也就是烦引位|ؓ0的对象开始检?
setMaxResult(int maxResults):讑֮一ơ最多检索出的对象数?在默认情况下,Query和Criteria接口索出查询接口中所有的对象
查单个对?
Query和Criteria接口都提供了以下用于执行查询语句q返回查询结果的Ҏ:
list()Ҏ:q回一个Listcd的查询结?在List集合中存放了所有满x询条件的持久化对?br />
uniqueResult()Ҏ:q回单个对象.
在某些情况下,如果只希望检索出一个对?可以先调用Query或Criteria接口的setMaxResult(1)Ҏ,把最大检索数目设?,然后调用uniqueResult()Ҏ,
该方法返回一个Objectcd的对?
// 采用HQL索方?br />
Customer customer=(Customer)session.createQuery("from Customer c order by c.name asc").setMaxResults(1).uniqueResult();
//采用QBC索方?br />
Customer customer=(Customer)session.createCriteria(Customer.class).add(Order.asc("name")).setMaxResults(1).uniqueResult();
1 |
DROP TABLE IF EXISTS `test`.`t_user`; CREATE TABLE `test`.`t_user` ( `id` int(11) NOT NULL auto_increment, `name` varchar(255) default NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=gbk; |
1 |
eclipse\plugins\org.ultimania.middlegenide_1.3.2\resource\template\build-hibernate.xml.vm |
1 |
<property name="gen.xdoclet-tag" value="true"> |
Struts 里面?
public class User { private String username; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } }
public class UserForm extends FormBean { private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
那么对应?JSP 面里的 Tag 可以写成:
<html:text property="user.username" />
但是如果q时候有想给生成的表单加?JavaScript 验证的话, 必须用下面的写法才能通过:
q是因ؓ Struts 标签最后生的 HTML 如下所C?
<form onsubmit="return validateForm(this);"> <input name="user.username" /> < SPAN>form>
直接引用 元素.user.username 肯定会出错的. 正确的方法参考上上面的代码段卛_.
其实q样子的集成感觉很不错的Q除了少了dto和{换(臛_你要用一个copyProperty吧)Qpojo实现了序列化Q?/pre>甚至可以直接深入到Hibernate底层Q这样子q~Z以前一直讨论formbean和po是不是合q或者在哪个层面上进行{换?/span>