??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲一区二区三区丝袜,亚洲人成色7777在线观看,亚洲综合男人的天堂色婷婷http://m.tkk7.com/relax/category/546.html记述我学习java的里E?/description>zh-cnWed, 21 Oct 2009 12:56:42 GMTWed, 21 Oct 2009 12:56:42 GMT60hibernate注解方式实现复合主键http://m.tkk7.com/relax/archive/2009/09/18/295587.htmlLLFri, 18 Sep 2009 08:29:00 GMThttp://m.tkk7.com/relax/archive/2009/09/18/295587.htmlhttp://m.tkk7.com/relax/comments/295587.htmlhttp://m.tkk7.com/relax/archive/2009/09/18/295587.html#Feedback1http://m.tkk7.com/relax/comments/commentRss/295587.htmlhttp://m.tkk7.com/relax/services/trackbacks/295587.html有时一个实体的主键可能同时为多个,例如同样是之前用的“CustomerEO”实体Q需要通过name和email来查找指定实体,当且仅当name和email的值完全相同时Q才认ؓ是相同的实体对象。要配置q样的复合主键,步骤如以下所C?/p>

Q?Q编写一个复合主键的cCustomerPKQ代码如下?/p>

CustomerPK.java

import java.io.Serializable;

 

public class CustomerPK implements Serializable {

 

         public CustomerPK() {

 

         }

 

         public CustomerPK(String name, String email) {

                   this.name = name;

                   this.email = email;

         }

 

         private String email;

 

         public String getEmail() {

                   return email;

         }

 

         public void setEmail(String email) {

                   this.email = email;

         }

 

         private String name;

 

         public String getName() {

                   return name;

         }

 

         public void setName(String name) {

                   this.name = name;

         }

 

         @Override

         public int hashCode() {

                   final int PRIME = 31;

                   int result = 1;

                   result = PRIME * result + ((email == null) ? 0 : email.hashCode());

                   result = PRIME * result + ((name == null) ? 0 : name.hashCode());

                   return result;

         }

 

         @Override

         public boolean equals(Object obj) {

                   if (this == obj)

                            return true;

                   if (obj == null)

                            return false;

                   if (getClass() != obj.getClass())

                            return false;

                   final CustomerPK other = (CustomerPK) obj;

                   if (email == null) {

                            if (other.email != null)

                                     return false;

                   } else if (!email.equals(other.email))

                            return false;

                   if (name == null) {

                            if (other.name != null)

                                     return false;

                   } else if (!name.equals(other.name))

                            return false;

                   return true;

         }

 

}

作ؓW合主键c,要满以下几点要求?/p>

l         必须实现Serializable接口?/p>

l         必须有默认的public无参数的构造方法?/p>

l         必须覆盖equals和hashCodeҎ。equalsҎ用于判断两个对象是否相同QEntityManger通过findҎ来查找EntityӞ是根据equals的返回值来判断的。本例中Q只有对象的name和email值完全相同时或同一个对象时则返回trueQ否则返回false。hashCodeҎq回当前对象的哈希码Q生成的hashCode相同的概率越越好,法可以q行优化?/p>

Q?Q通过@IdClass注释在实体中标注复合主键Q实体代码如下?/p>

@Entity

@Table(name = "customer")

@IdClass(CustomerPK.class)

public class CustomerEO implements java.io.Serializable {

 

         private Integer id;

 

         public Integer getId() {

                   return this.id;

         }

 

         public void setId(Integer id) {

                   this.id = id;

         }

        

         private String name;

 

@Id

         public String getName() {

                   return this.name;

         }

 

         public void setName(String name) {

                   this.name = name;

         }

        

         private String email;

@Id

         public String getEmail() {

                   return email;

         }

 

         public void setEmail(String email) {

                   this.email = email;

         }

}

标注复合主键旉要注意以下几个问题?/p>

l         @IdClass标注用于标注实体所使用主键规则的类。它的定义如下所C?/p>

@Target({TYPE}) @Retention(RUNTIME)

public @interface IdClass {

Class value();

}

属性Class表示W合主键所使用的类Q本例中使用CustomerPKq个复合主键cR?/p>

l         在实体中同时标注主键的属性。本例中在email和name的getterҎ前标注@IdQ表C符合主键用这两个属性?/p>

Q?Q这样定义实体的复合主键后,通过以下代码便可以获得指定的实体对象Q?/p>

    CustomerPK cpk = new CustomerPK("Janet","janetvsfei@yahoo.com.cn");

    CustomerEO instance = entityManager.find(CustomerEO.class, cpk);

 

本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/EJB_JPA/archive/2008/05/09/2422540.aspx



L 2009-09-18 16:29 发表评论
]]>
eclipse中从数据库生成hibernate实体c?/title><link>http://m.tkk7.com/relax/archive/2009/07/27/288537.html</link><dc:creator>L</dc:creator><author>L</author><pubDate>Mon, 27 Jul 2009 06:16:00 GMT</pubDate><guid>http://m.tkk7.com/relax/archive/2009/07/27/288537.html</guid><wfw:comment>http://m.tkk7.com/relax/comments/288537.html</wfw:comment><comments>http://m.tkk7.com/relax/archive/2009/07/27/288537.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://m.tkk7.com/relax/comments/commentRss/288537.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/relax/services/trackbacks/288537.html</trackback:ping><description><![CDATA[<p>        Z么写q篇BLOGQ是因ؓl常有同事或|友问v我hiberante实体cȝ生成问题。所以下ơ再有h问我可以省一堆的话了Q其实这个真的是很简单?br />         现在hibernate在项目中的应用是来q广泛了。我是从hibernate开始支持注释语法后才开始研I它的。说实在的,原来的hibernate生成的一堆堆的XML文g看着头晕,q不如自己写的SQL语句来的舒服Q所以一直听朋友和同事介l,可自׃直不屑用之?br />         可是现在有福了hibernate是JPA最常用的实C一Q而且hiberante自n也对注释语法q行了支持。现在再不用ȝ那一堆堆的XML映射了。而且eclipseq提供了从数据库直接生成Entity Class的工兗既然可以少写或不写SQL语句那合乐而ؓ为呢。废话少_开始做h?/p>         q是从我们开始项目的W一步说P新徏目。一般我们用java做web目都是File->New->Dynamic Web ProjectQ如下图Q?br /> <img border="0" alt="" src="http://m.tkk7.com/images/blogjava_net/relax/newProject.JPG" width="640" height="480" /><br /> 然后会出现新建项目的对话框如图所C?br /> <img border="0" alt="" src="http://m.tkk7.com/images/blogjava_net/relax/newProject2.JPG" width="480" height="471" /><br /> 然后点击Modify按钮后如?br /> <img style="width: 477px; height: 373px" border="0" alt="" src="http://m.tkk7.com/images/blogjava_net/relax/modifyConfig.JPG" width="477" height="373" /><br /> java persistence选中Q这样就为项目增加了JPA的特性,其它Ҏ根据项目需要自行修攏V点击OK后。点dơNEXTQ忽略的几步Ҏ自n情况而定Q到JPA FACETH口Q如下图Q?br /> <img border="0" alt="" src="http://m.tkk7.com/images/blogjava_net/relax/jpafacet.JPG" width="658" height="647" /><br /> <br /> 因ؓ׃用的是hibernate列表中没有所以platform选择Generic,Type选择disable library configuration,因ؓ׃把需要的jar文g直接攑ֈWEB-INF下的lib目录中就可以了。所以不用配|。再下面的connectionq个是必要配置的要不我们怎么从数据库中生成啊。对不?br /> 如果以前配置q连接直接选择可以了Q如果没有配|过点击 add connection.如下图:<br /> <img border="0" alt="" src="http://m.tkk7.com/images/blogjava_net/relax/newconnection.JPG" width="525" height="596" /><br /> 选择要用的数据库类型,然后下一步,如下图。其实这个类型也没啥作用只是个生成连接字W串的模版而以?br /> <img border="0" alt="" src="http://m.tkk7.com/images/blogjava_net/relax/configDriver.JPG" width="525" height="632" /><br /> 选择已有的驱动,如果没有怎么办,废话Q当然是l箋新增了。这块不详述了,点击driver后面W一个按钮,Ҏ提示选择对应的jar文g卛_?br /> 做完上述操作点击Finish.回到JPA FacetH口。选中Discover annotated classes automatically,把Create orm.xml钓掉。然后点Finish目徏完了?br /> 然后在项目文件夹上右键选择JPA tools->Generate Entities from Tables.后如下图Q?br /> <img border="0" alt="" src="http://m.tkk7.com/images/blogjava_net/relax/generateEntityDalg.JPG" width="631" height="703" /><br /> 选择建好的connection如果没有connect connect一下。就会如上图所CZQ有时eclipse会有些小问题看不见表Q可以重启一下试试,实在不行q接徏个JPA project Q生成实体后再拷到自q目中就可以了。)选中要生成实体的表,Next如下图:<br /> <img border="0" alt="" src="http://m.tkk7.com/images/blogjava_net/relax/tableassociations.JPG" width="631" height="703" /><br /> 上面是表之间的关p,如果可以做相应的修改Q用的是ecipse 3.5貌似eclipse3.4q没q个功能Qeclipse来强了)Q再Next后如下图Q?br /> <img border="0" alt="" src="http://m.tkk7.com/images/blogjava_net/relax/tableMapping.JPG" width="631" height="703" /><br /> Q这个好像也是eclipse 3.5才加的)都能看明白吧。按照需要改改就可以了,q里不多啰嗦。再Next<br /> 后,如下图:<br /> <img border="0" alt="" src="http://m.tkk7.com/images/blogjava_net/relax/individual.JPG" width="631" height="703" /><br /> q是一些表的每个属性的调整Q一般也不用调了。Finish好了?br /> 嘿嘿l于完成了。脓了这么多图,累死我了。不qؓ了大家能弄明白,q是图比文字更能说明情况Q我辛苦点就辛苦点吧。?br /> 看看源码中生成的java文g是不是你惌的,具体q些cL么用。就不是q篇文章要说的问题了。如果大家有需要,我下回接着写? <img src ="http://m.tkk7.com/relax/aggbug/288537.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/relax/" target="_blank">L</a> 2009-07-27 14:16 <a href="http://m.tkk7.com/relax/archive/2009/07/27/288537.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate中Criteria的完整用法(转蝲Q?/title><link>http://m.tkk7.com/relax/archive/2008/09/25/231138.html</link><dc:creator>L</dc:creator><author>L</author><pubDate>Thu, 25 Sep 2008 08:35:00 GMT</pubDate><guid>http://m.tkk7.com/relax/archive/2008/09/25/231138.html</guid><wfw:comment>http://m.tkk7.com/relax/comments/231138.html</wfw:comment><comments>http://m.tkk7.com/relax/archive/2008/09/25/231138.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/relax/comments/commentRss/231138.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/relax/services/trackbacks/231138.html</trackback:ping><description><![CDATA[说明Q该文内容ؓ转蝲Q因对自己有用,故保留下来,但是因ؓ当时没记录博客地址Q所以无法说明来源了Q之后的两篇关于面向接口~程的文章也是如?Q?br /> <br /> Hibernate中Criteria的完整用?008q?7?9?星期?00:16最q在目中?Spring ?Hibernate q行开发,有感?Criteria 比较好用Q在查询Ҏ<br /> <br /> 设计上可以灵zȝҎ Criteria 的特Ҏ方便地进行查询条件的l装。现在对 Hibernate的Criteria 的用法进行ȝQ?br />   Hibernate 设计?CriteriaSpecification 作ؓ Criteria 的父接口Q下面提供了 Criteria和DetachedCriteria ?<br />   Criteria ?DetachedCriteria 的主要区别在于创建的形式不一P Criteria 是在U的Q所<br /> 以它是由 Hibernate Session q行创徏的;?DetachedCriteria 是离U的Q创建时无需 <br /> SessionQDetachedCriteria 提供?2 个静态方?forClass(Class) ?forEntityName(Name) <br /> q行DetachedCriteria 实例的创建?Spring 的框架提供了getHibernateTemplate<br /> ().findByCriteria(detachedCriteria) Ҏ可以很方便地ҎDetachedCriteria 来返回查询结<br /> 果?<br />   Criteria ?DetachedCriteria 均可使用 Criterion ?Projection 讄查询条g。可以设<br /> |?FetchMode( 联合查询抓取的模?) Q设|排序方式。对?Criteria q可以设|?FlushModel <br /> Q冲?Session 的方式)?LockMode Q数据库锁模式)?<br /> 下面?Criterion ?Projection q行详细说明?br />   Criterion ?Criteria 的查询条件。Criteria 提供?add(Criterion criterion) Ҏ?br /> d查询条g?br />   Criterion 接口的主要实现包括: Example ?Junction ?SimpleExpression 。?<br /> Junction 的实际用是它的两个子类 conjunction ?disjunction Q分别是使用 AND ?OR ?br /> 作符q行来联l查询条仉合?br />   Criterion 的实例可以通过 Restrictions 工具cL创徏QRestrictions 提供了大量的静?br /> ҎQ如 eq Q等于)?ge Q大于等于)?between {来Ҏ的创?Criterion 查询条g <br /> QSimpleExpression 实例Q。除此之外, Restrictions q提供了Ҏ来创?conjunction ?<br /> disjunction 实例Q通过往该实例的 add(Criteria) Ҏ来增加查询条件Ş成一个查询条仉?br /> ?br />   至于 Example 的创建有所不同Q?Example 本n提供了一个静态方?create(Object <br /> entity) Q即Ҏ一个对象(实际使用中一般是映射到数据库的对象)来创建。然后可以设|一?br /> qo条gQ?<br /> Example exampleUser =Example.create(u) <br /> .ignoreCase() // 忽略大小?<br /> .enableLike(MatchMode.ANYWHERE); <br /> // ?String cd的属性,无论在那里值在那里都匹配。相当于 %value% <br /> Project 主要是让 Criteria 能够q行报表查询Qƈ可以实现分组?Project 主要?<br /> SimpleProjection ?ProjectionList ?Property 三个实现。其?SimpleProjection ?<br /> ProjectionList 的实例化是由内徏?Projections 来完成,如提供的 avg ?count ?max ?<br /> min ?sum 可以让开发者很ҎҎ个字D进行统计查询?<br />     Property 是对某个字段q行查询条g的设|,如通过Porperty.forName(“color”).in<br /> (new String[]{“black”,”red”,”write”}); 则可以创Z?Project 实例。通过 <br /> criteria ?add(Project) Ҏ加入到查询条件中厅R?<br />   使用 Criteria q行查询Q主要要清晰的是 Hibernate 提供了那些类和方法来满开发中?br /> 询条件的创徏和组装,下面介绍几种用法Q?br /> 1. 创徏一个Criteria 实例<br /> org.hibernate.Criteria接口表示特定持久cȝ一个查询。Session?Criteria实例的工厂?br /> Criteria crit = sess.createCriteria(Cat.class);<br /> crit.setMaxResults(50);<br /> List cats = crit.list();<br /> <br /> 2. 限制l果集内?br /> 一个单独的查询条g是org.hibernate.criterion.Criterion 接口的一个实例?br /> <br /> org.hibernate.criterion.Restrictionsc?定义了获得某些内|Criterioncd的工厂方法?br /> List cats = sess.createCriteria(Cat.class)<br />   .add( Restrictions.like("name", "Fritz%") )<br />   .add( Restrictions.between("weight", minWeight, maxWeight) )<br />   .list();<br /> <br /> U束可以按逻辑分组?<br /> <br /> List cats = sess.createCriteria(Cat.class)<br />   .add( Restrictions.like("name", "Fritz%") )<br />   .add( Restrictions.or(<br />     Restrictions.eq( "age", new Integer(0) ),<br />     Restrictions.isNull("age")<br />   ) )<br />   .list();<br /> <br /> List cats = sess.createCriteria(Cat.class)<br />   .add( Restrictions.in( "name", new String[] { "Fritz", "Izi", "Pk" } ) )<br />   .add( Restrictions.disjunction()<br />     .add( Restrictions.isNull("age") )<br />     .add( Restrictions.eq("age", new Integer(0) ) )<br />     .add( Restrictions.eq("age", new Integer(1) ) )<br />     .add( Restrictions.eq("age", new Integer(2) ) )<br />   ) )<br />   .list();<br /> <br /> Hibernate提供了相当多的内|criterioncd(Restrictions 子类), 但是其有用的是可以允许<br /> <br /> 你直接用SQL?br /> <br /> List cats = sess.createCriteria(Cat.class)<br />   .add( Restrictions.sql("lower({alias}.name) like lower(?)", "Fritz%", <br /> <br /> Hibernate.STRING) )<br />   .list();<br /> <br /> {alias}占位W应当被替换查询实体的列别名?<br /> Property实例是获得一个条件的另外一U途径。你可以通过调用Property.forName() 创徏一?br /> <br /> Property?<br /> <br /> Property age = Property.forName("age");<br /> List cats = sess.createCriteria(Cat.class)<br />   .add( Restrictions.disjunction()<br />     .add( age.isNull() )<br />     .add( age.eq( new Integer(0) ) )<br />     .add( age.eq( new Integer(1) ) )<br />     .add( age.eq( new Integer(2) ) )<br />   ) )<br />   .add( Property.forName("name").in( new String[] { "Fritz", "Izi", "Pk" } ) )<br />   .list();<br /> <br /> 3. l果集排?br /> 你可以用org.hibernate.criterion.Order来ؓ查询l果排序?<br /> <br /> List cats = sess.createCriteria(Cat.class)<br />   .add( Restrictions.like("name", "F%")<br />   .addOrder( Order.asc("name") )<br />   .addOrder( Order.desc("age") )<br />   .setMaxResults(50)<br />   .list();<br /> <br /> List cats = sess.createCriteria(Cat.class)<br />   .add( Property.forName("name").like("F%") )<br />   .addOrder( Property.forName("name").asc() )<br />   .addOrder( Property.forName("age").desc() )<br />   .setMaxResults(50)<br />   .list();<br /> <br /> 4. 兌<br /> 你可以用createCriteria()非常Ҏ的在互相兌的实体间建立 U束?br /> <br /> List cats = sess.createCriteria(Cat.class)<br />   .add( Restrictions.like("name", "F%")<br />   .createCriteria("kittens")<br />     .add( Restrictions.like("name", "F%")<br />   .list();<br /> <br /> <br /> 注意W二?createCriteria()q回一个新?Criteria实例Q该实例引用kittens 集合中的元素?<br /> 接下来,替换形态在某些情况下也是很有用的?br /> <br /> List cats = sess.createCriteria(Cat.class)<br />   .createAlias("kittens", "kt")<br />   .createAlias("mate", "mt")<br />   .add( Restrictions.eqProperty("kt.name", "mt.name") )<br />   .list();<br /> <br /> <br /> (createAlias()q不创徏一个新?Criteria实例? <br /> Cat实例所保存的之前两ơ查询所q回的kittens集合?没有被条仉qo的。如果你希望只获?br /> <br /> W合条g的kittensQ?你必M用returnMaps()?<br /> <br /> List cats = sess.createCriteria(Cat.class)<br />   .createCriteria("kittens", "kt")<br />   .add( Restrictions.eq("name", "F%") )<br />   .returnMaps()<br />   .list();<br /> Iterator iter = cats.iterator();<br /> while ( iter.hasNext() ) {<br />   Map map = (Map) iter.next();<br />   Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);<br />   Cat kitten = (Cat) map.get("kt");<br /> }<br /> <br /> 5. 动态关联抓?br /> 你可以用setFetchMode()在运行时定义动态关联抓取的语义?<br /> <br /> List cats = sess.createCriteria(Cat.class)<br />   .add( Restrictions.like("name", "Fritz%") )<br />   .setFetchMode("mate", FetchMode.EAGER)<br />   .setFetchMode("kittens", FetchMode.EAGER)<br />   .list();<br /> <br /> q个查询可以通过外连接抓取mate和kittens?br /> <br /> 6. 查询CZ<br /> org.hibernate.criterion.Examplecd怽通过一个给定实?构徏一个条件查询?br /> <br /> Cat cat = new Cat();<br /> cat.setSex('F');<br /> cat.setColor(Color.BLACK);<br /> List results = session.createCriteria(Cat.class)<br />   .add( Example.create(cat) )<br />   .list();<br /> <br /> <br /> 版本属性、标识符和关联被忽略。默认情况下gؓnull的属性将被排除?<br /> 可以自行调整Example使之更实用?<br /> <br /> Example example = Example.create(cat)<br />   .excludeZeroes()       //exclude zero valued properties<br />   .excludeProperty("color") //exclude the property named "color"<br />   .ignoreCase()         //perform case insensitive string comparisons<br />   .enableLike();         //use like for string comparisons<br /> List results = session.createCriteria(Cat.class)<br />   .add(example)<br />   .list();<br /> <br /> <br /> 甚至可以使用examples在关联对象上攄条g?br /> <br /> List results = session.createCriteria(Cat.class)<br />   .add( Example.create(cat) )<br />   .createCriteria("mate")<br />     .add( Example.create( cat.getMate() ) )<br />   .list();<br /> <br /> <br /> 7. 投媄(Projections)、聚合(aggregationQ和分组QgroupingQ?br /> org.hibernate.criterion.Projections?Projection 的实例工厂。我们通过调用 <br /> <br /> setProjection()应用投媄C个查询?<br /> <br /> List results = session.createCriteria(Cat.class)<br />   .setProjection( Projections.rowCount() )<br />   .add( Restrictions.eq("color", Color.BLACK) )<br />   .list();<br /> <br /> List results = session.createCriteria(Cat.class)<br />   .setProjection( Projections.projectionList()<br />     .add( Projections.rowCount() )<br />     .add( Projections.avg("weight") )<br />     .add( Projections.max("weight") )<br />     .add( Projections.groupProperty("color") )<br />   )<br />   .list();<br /> <br /> <br /> 在一个条件查询中没有必要昑ּ的?"group by" 。某些投q型就是被定义?分组投媄Q他<br /> <br /> 们也出现在SQL的group by子句中?<br /> <br /> 可以选择把一个别名指z一个投影,q样可以使投影DU束或排序所引用。下面是两种不同?br /> <br /> 实现方式Q?br /> <br /> List results = session.createCriteria(Cat.class)<br />   .setProjection( Projections.alias( Projections.groupProperty("color"), "colr" ) )<br />   .addOrder( Order.asc("colr") )<br />   .list();<br /> <br /> <br /> <br /> List results = session.createCriteria(Cat.class)<br />   .setProjection( Projections.groupProperty("color").as("colr") )<br />   .addOrder( Order.asc("colr") )<br />   .list();<br /> <br /> alias()和as()Ҏ便的一个投影实例包装到另外一?别名的Projection实例中。简而言之,<br /> <br /> 当你d一个投影到一个投影列表中?你可以ؓ它指定一个别名: <br /> <br /> List results = session.createCriteria(Cat.class)<br />   .setProjection( Projections.projectionList()<br />     .add( Projections.rowCount(), "catCountByColor" )<br />     .add( Projections.avg("weight"), "avgWeight" )<br />     .add( Projections.max("weight"), "maxWeight" )<br />     .add( Projections.groupProperty("color"), "color" )<br />   )<br />   .addOrder( Order.desc("catCountByColor") )<br />   .addOrder( Order.desc("avgWeight") )<br />   .list();<br /> <br /> <br /> List results = session.createCriteria(Domestic.class, "cat")<br />   .createAlias("kittens", "kit")<br />   .setProjection( Projections.projectionList()<br />     .add( Projections.property("cat.name"), "catName" )<br />     .add( Projections.property("kit.name"), "kitName" )<br />   )<br />   .addOrder( Order.asc("catName") )<br />   .addOrder( Order.asc("kitName") )<br />   .list();<br /> <br /> <br /> 也可以用Property.forName()来表C投影:<br /> <br /> List results = session.createCriteria(Cat.class)<br />   .setProjection( Property.forName("name") )<br />   .add( Property.forName("color").eq(Color.BLACK) )<br />   .list();<br /> List results = session.createCriteria(Cat.class)<br />   .setProjection( Projections.projectionList()<br />     .add( Projections.rowCount().as("catCountByColor") )<br />     .add( Property.forName("weight").avg().as("avgWeight") )<br />     .add( Property.forName("weight").max().as("maxWeight") )<br />     .add( Property.forName("color").group().as("color" )<br />   )<br />   .addOrder( Order.desc("catCountByColor") )<br />   .addOrder( Order.desc("avgWeight") )<br />   .list();<br /> <br /> <br /> 8. ȝ(detached)查询和子查询<br /> DetachedCriteriacM你在一个session范围之外创徏一个查询,q且可以使用L?Session?br /> <br /> 执行它?br /> <br /> DetachedCriteria query = DetachedCriteria.forClass(Cat.class)<br />   .add( Property.forName("sex").eq('F') );<br /> //创徏一个Session<br /> Session session = .;<br /> Transaction txn = session.beginTransaction();<br /> List results = query.getExecutableCriteria(session).setMaxResults(100).list();<br /> txn.commit();<br /> session.close();<br /> <br /> <br /> DetachedCriteria也可以用以表C子查询。条件实例包含子查询可以通过 Subqueries或?br /> Property获得?br /> <br /> DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class)<br />   .setProjection( Property.forName("weight").avg() );<br /> session.createCriteria(Cat.class)<br />   .add( Property.forName("weight).gt(avgWeight) )<br />   .list();<br /> DetachedCriteria weights = DetachedCriteria.forClass(Cat.class)<br />   .setProjection( Property.forName("weight") );<br /> session.createCriteria(Cat.class)<br />   .add( Subqueries.geAll("weight", weights) )<br />   .list();<br /> <br /> 怺兌的子查询也是有可能的Q?br /> <br /> DetachedCriteria avgWeightForSex = DetachedCriteria.forClass(Cat.class, "cat2")<br />   .setProjection( Property.forName("weight").avg() )<br />   .add( Property.forName("cat2.sex").eqProperty("cat.sex") );<br /> session.createCriteria(Cat.class, "cat")<br />   .add( Property.forName("weight).gt(avgWeightForSex) )<br />   .list();<br /> <img src ="http://m.tkk7.com/relax/aggbug/231138.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/relax/" target="_blank">L</a> 2008-09-25 16:35 <a href="http://m.tkk7.com/relax/archive/2008/09/25/231138.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 复合查询http://m.tkk7.com/relax/archive/2008/03/27/188943.htmlLLThu, 27 Mar 2008 02:23:00 GMThttp://m.tkk7.com/relax/archive/2008/03/27/188943.htmlhttp://m.tkk7.com/relax/comments/188943.htmlhttp://m.tkk7.com/relax/archive/2008/03/27/188943.html#Feedback0http://m.tkk7.com/relax/comments/commentRss/188943.htmlhttp://m.tkk7.com/relax/services/trackbacks/188943.html 

         
复合查询主要是处理,h兌关系的两个实体怎样q行兌查询Q比?/span>User实体对象?/span>Addres实体对象h一对多的关联关p,我们可以如下构造符合查询:
Criteria criteria=session.createCriteria(User.class);
   Criteria addcriteria=criteria.createCriteria(“addresses”);(1)
   addcriteria.add(Express.like(“address”,”%tianjin%”));
  List list=criteria.list();
   for(int i=0;i
     User user=(User)list.get(i);
     System.out.println(user.getName()+”\n”);
     Set addresses=user.getAddresses();
     Iterator it=addresses.iterator();
     while(it.hasNext(){
      Address address=(Address)it.next();
      System.out.println(address.getAddress()+”\n”);
     }
   }
当执行到了(1Q处Ӟ表明要针?/span>User对象?/span>addresses属性添加新的查询条Ӟ因此当执?/span>criteria.list()ӞHibernate会生成类似如下的SQL语句Q?/span>
Select * from user inner join address on user.id=address.id where address.address like ‘%shanghai%’;
正如我们所见,我们可以通过?/span>Criteria中添加保存关联对象的集合属性(addresses属性保存与User对象相关联的Address对象Q,来构造复合查询,在数据库一端是通过内连接查询来实现?/span>
 
相关Q?/span>
1. Hibernate
2.
QBC查询Q?/span>
   QBC查询是通过使用Hibernate提供?/span>Query By Criteria API来查询对象,q种API装?/span>SQL语句的动态拼装,Ҏ询提供了更加面向对象的功能接口。我们看下面的示例程序:
Criteria criteria=session.createCriteria(User.class);
criteria.add(Expression.eq(“name”,”zx”));
criteria.add(Expression.eq(“age”,new Integer(27));
List list=criteria.list();
当执?/span>criteria.list()时会生成cMq样?/span>SQL语句Q?/span>Select * from user where name=’zx’ and age=27;所以在q里我们可以看出Q?/span>Criteria实际上是一个查询容器,它对查询条g表达式的dq行了封装,具体的查询条件是通过add()Ҏd的,而且具体的查询条件的表达式运是通过Expression指定的?/span>Hibernate在运行期会根?/span>Criteria指定的表辑ּ条g来添加查询条Ӟq且生成查询语句。这U方式非常符?/span>Java以及所有面向对象编E语a的编E方式,所以大多数的持久层框架都提供了对这U方式查询的支持。下面我们讲解这U查询方式的各个技术细节?/span>
1?/span>Criteria查询表达式:
正如我们所见,ExpressionҎ询语句的表达式进行了装和限Ӟ下表列出?/span>Expression所有的ҎQ以及每个方法所对应的查询表辑ּ及其限制?/span>
Ҏ
描述
Expression.eq
对应SQL?#8220;field=value”表达?/span>
如:Expression.eq(“name”,”zx”);
Expression.allEq
Ҏ的参Cؓ一?/span>Mapcd对象Q包含多个名/值对对应关系Q相当于多个Expression.eq的叠?/span>
Expression.gt
对应SQL?#8220;field>value”表达?/span>
Expression.ge
对应SQL?#8220;field>=value”表达?/span>
Expression.lt
对应SQL?#8220;field”表达?/span>
Expression.le
对应SQL?#8220;field<=value”表达?/span>
Expression.between
对应SQL语句?/span>between表达式,如:查询q龄?/span>21?/span>27岁之间的用户Q可以写?/span>Expression.between(“age”,new Integer(21),new Integer(27));
Expression.like
对应SQL语句?/span>”field like value”表达?/span>
Expression.in
对应SQL语句?#8220;field in(……)”表达?/span>
Expression.eqProperty
用于比较两个属性|对应”field=field”SQL表达?/span>
Expression.gtProperty
用于比较两个属性|对应”field>field”SQL表达?/span>
Expression.geProperty
用于比较两个属性|对应”field>=field”SQL表达?/span>
Expression.ltProperty
用于比较两个属性|对应”field表达?/span>
Expression.leProperty
用于比较两个属性|对应”field<=field”SQL表达?/span>
Expression.and
对应SQL语句?/span>And关系l合Q如Q?/span>Expression.and(Expression.eq(“name”,”zx”),Expression.eq(“sex”,”1”));
Expression.or
对应SQL语句?/span>Or关系l合Q如Q?/span>Expression.or(Expression.eq(“name”,”zx”),Expression.eq(“name”,”zhaoxin”));
Expression.sql
作ؓ补充q个Ҏ提供了原?/span>SQL语句查询的支持,在执行时直接通过原生SQL语句q行限定Q如Q?/span>Expression.sql(“lower({alias}.name) like (?)”,“zhao%”,Hibernate.STRING) ;在运行时{ alias }会由当前查询所兌的实体类名替换,()中的?会?/span>”zhao%”替换Qƈ且类型由Hibernate.STRING指定?/span>
注意Q?/span>Expression各方法中的属性参敎ͼ各方法中的第一个参敎ͼ所指定的属性名Uͼ如:name,sexQ,q不是数据库表中的实际字D名Uͼ而是实体对象中映实际数据表字段的类属性名U?/span>
 
2?/span>CZ查询Q?/span>
   CZ查询是通过ExamplecL完成的,ExamplecdCCriterion接口Q可以用?/span>Criteria查询条gQ?/span>Examplecȝ作用是:Ҏ已有对象Q查询属性g之相同的其他对象。如下代码所C:
Criteria criteria=session.createCriteria(User.class);
User exampleuser=new User(“zx”);
criteria.add(Example.create(exampleuser));
List list=criteria.list();
for(int i=0;i
   User user=(User)list.get(i);
   System.out.println(user.getName()+”\n”);
}
上述代码?/span>User exampleuser=new User(“zx”);criteria.add(Example.create(exampleuser));两句相当?/span>
criteria.add(Expression.eq(“name”,”zx”));因此会生成类似如下的SQL语句Q?/span>
select * from user where name=’zx’;在上面的代码?/span>exampleuserUCؓCZ对象?/span>
  ?/span>Hibernate中队CZ查询Q默认情况下会排除掉CZ对象中属性gؓI的属性,q可以调?/span>Example.excludeNoneQ排除空串|/excludeZerosQ排除零|Q或者调?/span>Example.excludePropertyҎ来指定排除特定属性?/span>
   CZ查询主要应用于组合查询中Q比如根据用戯入的查询条g动态生成最l的查询语句Q通过使用CZ查询Q可以避免由于查询条件过多而写的大?/span>if判断语句?/span>
3?/span>复合查询Q?/span>
复合查询主要是处理,h兌关系的两个实体怎样q行兌查询Q比?/span>User实体对象?/span>Addres实体对象h一对多的关联关p,我们可以如下构造符合查询:
Criteria criteria=session.createCriteria(User.class);
   Criteria addcriteria=criteria.createCriteria(“addresses”);(1)
   addcriteria.add(Express.like(“address”,”%tianjin%”));
  List list=criteria.list();
   for(int i=0;i
     User user=(User)list.get(i);
     System.out.println(user.getName()+”\n”);
     Set addresses=user.getAddresses();
     Iterator it=addresses.iterator();
     while(it.hasNext(){
      Address address=(Address)it.next();
      System.out.println(address.getAddress()+”\n”);
     }
   }
当执行到了(1Q处Ӟ表明要针?/span>User对象?/span>addresses属性添加新的查询条Ӟ因此当执?/span>criteria.list()ӞHibernate会生成类似如下的SQL语句Q?/span>
Select * from user inner join address on user.id=address.id where address.address like ‘%shanghai%’;
正如我们所见,我们可以通过?/span>Criteria中添加保存关联对象的集合属性(addresses属性保存与User对象相关联的Address对象Q,来构造复合查询,在数据库一端是通过内连接查询来实现?/span>
 
 
 
4?/span>Criteria的高U特性:
A?/span>限定q回记录条数Q?/span>
 我们可以通过利用Criteria.setFirstResult/setMaxResultҎ来限定返回某一ơ查询的记录敎ͼ如下代码Q?/span>
Criteria criteria=session.createCriteria(User.class);
criteria.setFirstResult(100);
criteria.setMaxResult(200);
通过以上代码可以讑֮该次查询q回user表中的从W?/span>100条记录开始直到第200条记录结束的100条记录?/span>
B?/span>Ҏ询结果进行排序:
 可通过使用net.sf.hibernate.expression.Ordercd以对查询l果集进行排序,如下面代码:
Criteria criteria=session.createCriteria(User.class);
criteria.add(Expression.eq(“groupid”,”2”);
criteria.addOrder(Order.asc(“name”));
criteria.addOrder(Order.desc(“groupid”));
List list=criteria.list();
通过使用Orderasc()/desc()ҎQ可以指定针Ҏ个字D늚排序逻辑Q如果执行上qC码,会生成类似如下的SQL语句Q?/span>
Select * from user where groupid=’2’ order by name asc,groupid desc
C?/span>分组与统计:
   ?/span>Hibernate3中,?/span>Criteria又增M新功能,可以支持分组与统计功能,?/span>Hibernate3中增加了Projections以及ProjectionListc,q两个类对分l与l计功能q行了封装,如下代码Q?/span>
Criteria criteria=session.createCriteria(User.class);
criteria.setProjection(Projections.groupProperty(“age”));(1)
List list=criteria.list();
Iterator it=list.iterator();
while(it.hasNext()){
 System.out.println(it.next());
}
通过Q?/span>1Q处的代码,我们通过ProjectionscL定了用于分组的目标属性,当进行检索时Hibernate会生成类似如下的SQL语句Q?/span>
Select age from user group by age;
q可以通过使用Projections?/span>avg()/rowCount()/count()/max()/min()/countDistinct(){方法来实现l计功能Q如下面的代码示例:
Criteria criteria=session.createCriteria(User.class);
criteria.setProjection(Projections.avg(“age”));(1)
List list=criteria.list();
Iterator it=list.iterator();
while(it.hasNext()){
 System.out.println(it.next());
}
通过Q?/span>1Q处的代码,我们实现了对用户q_q龄的统计,当进行检索时Q?/span>Hibernate会生成类似如下的SQL语句Q?/span>
Select avg(age) from user;
另外Q在SQL语句中的多条件分l与l计功能Q可以利?/span>ProjectionListcL实现Q如下面代码所C:
Criteria criteria=session.createCriteria(User.class);
ProjectionList prolist=Projections.projectionList();
prolist.add(Projections.groupProperty(“age”));
prolist.add(Projections.rowCount());
criteria.setProjection(prolist);
List list=criteria.list();
通过以上代码Q实C对不同年龄h员数量的分组l计Q当q行索时Q?/span>Hibernate会生成类似如下的SQL语句Q?/span>
Select age,count(*) from user group by age;
5?/span>DetachedCriteria:
?/span>Hibernate2中,Criteria实例是与创徏它的Session实例h相同的生命周期的Q也是_Session实例是它所创徏?/span>Criteria实例的宿主,?/span>Session关闭Ӟ寄生?/span>Session实例?/span>Criteria都将失效。这对Criteria的重用造成了困难,Z实现Criteria实例的重用,?/span>Hibernate3中提供了一?/span>DetachedCriteriac,DetachedCriteria实例的生命周期与Session实例的生命周期无养I我们可以利用DetachedCriteria对一些常用的Criteria查询条gq行抽离Q当需要进行检索时再与Session实例兌Q从而获得运行期?/span>Criteria实例。如下面的代码所C:
   DetachedCriteria dc= DetachedCriteria.forClass(User.class);
   dc.add(Expression.eq(“name”,”zhaoxin”));
   dc.add(Expression.eq(“sex”,”1”));
   Criteria criteria=dc.getExecutableCriteria(session);
   Iterator it=criteria.list().iterator();
   while(it.hasNext()){
     User user=(User)it.next();
     System.out.println(user.getName());
   }
 正如我们所见,DetachedCriteria的生存周期与session实例无关Q当需要进行检索时Q通过getExecutableCriteria(session)ҎQ与当前?/span>Session实例兌q获得运行期?/span>Criteria实例Q完成检索?/span>
DetachedCriteria也可以用于完成子查询功能Q如下代码所C:
DetachedCriteria dc= DetachedCriteria.forClass(User.class);
dc.setProjection(Projections.avg(“age”));
Criteria criteria=session.createCriteria(User.class);
criteria.add(Subqueries.propertyGt(“age”,dc));
List list=criteria.list();
通过Subqueriesc,实现了添加子查询的功能,我们?/span>DetachedCriteria所讑֮的查询条Ӟ当作子查询添加到了运行时Criteria实例的查询条件中Q当执行索时Hibernate会生成类似如下的SQL语句Q?/span>
Select * from user where age>(select avg(age) from user group by age);


L 2008-03-27 10:23 发表评论
]]>
使用struts+spring+hibernate l装web应用http://m.tkk7.com/relax/archive/2005/03/22/2315.htmlLLTue, 22 Mar 2005 03:19:00 GMThttp://m.tkk7.com/relax/archive/2005/03/22/2315.htmlhttp://m.tkk7.com/relax/comments/2315.htmlhttp://m.tkk7.com/relax/archive/2005/03/22/2315.html#Feedback0http://m.tkk7.com/relax/comments/commentRss/2315.htmlhttp://m.tkk7.com/relax/services/trackbacks/2315.html matrix.com.cn