??xml version="1.0" encoding="utf-8" standalone="yes"?>永久亚洲成a人片777777,137大胆人体在线观看,98精品国产自产在线观看http://www.aygfsteel.com/fangts/category/28198.htmlJAVAzh-cnMon, 20 Jul 2009 22:13:21 GMTMon, 20 Jul 2009 22:13:21 GMT60Hibernate QBC查询 http://www.aygfsteel.com/fangts/archive/2009/07/19/287342.htmlҎ?/dc:creator>Ҏ?/author>Sun, 19 Jul 2009 08:12:00 GMThttp://www.aygfsteel.com/fangts/archive/2009/07/19/287342.htmlhttp://www.aygfsteel.com/fangts/comments/287342.htmlhttp://www.aygfsteel.com/fangts/archive/2009/07/19/287342.html#Feedback0http://www.aygfsteel.com/fangts/comments/commentRss/287342.htmlhttp://www.aygfsteel.com/fangts/services/trackbacks/287342.htmlHibernate QBC查询
            QBC查询Q?
               QBC查询是通过使用Hibernate提供的Query By Criteria
            API来查询对象,q种API装了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();
            当执行criteria.list()时会生成cMq样的SQL语句QSelect * from user where name=’zx’
            and
            age=27;所以在q里我们可以看出QCriteria实际上是一个查询容器,它对查询条g表达式的dq行了封装,具体的查询条件是通过add()Ҏd的,而且具体的查询条件的表达式运是通过Expression指定的。Hibernate在运行期会根据Criteria指定的表辑ּ条g来添加查询条Ӟq且生成查询语句。这U方式非常符合Java以及所有面向对象编E语a的编E方式,所以大多数的持久层框架都提供了对这U方式查询的支持。下面我们讲解这U查询方式的各个技术细节?
            1、Criteria查询表达式:
            正如我们所见,ExpressionҎ询语句的表达式进行了装和限Ӟ下表列出了Expression所有的ҎQ以及每个方法所对应的查询表辑ּ及其限制?
                  Ҏ描述
                  Expression.eq对应SQL?#8220;field=value”表达?
                  如:Expression.eq(“name”,”zx”);
                  Expression.allEqҎ的参Cؓ一个Mapcd对象Q包含多个名/值对对应关系Q相当于多个Expression.eq的叠?
                  Expression.gt对应SQL?#8220;field>value”表达?
                  Expression.ge对应SQL?#8220;field>=value”表达?
                  Expression.lt对应SQL?#8220;field”表达?
                  Expression.le对应SQL?#8220;field<=value”表达?
                  Expression.between对应SQL语句的between表达式,如:查询q龄?1?7岁之间的用户Q可以写成Expression.between(“age”,new
                  Integer(21),new Integer(27));
                  Expression.like对应SQL语句?#8221;field like value”表达?
                  Expression.in对应SQL语句?#8220;field in(……)”表达?
                  Expression.eqProperty用于比较两个属性|对应”field=field”SQL表达?
                  Expression.gtProperty用于比较两个属性|对应”field>field”SQL表达?
                  Expression.geProperty用于比较两个属性|对应”field>=field”SQL表达?
                  Expression.ltProperty用于比较两个属性|对应”field表达?
                  Expression.leProperty用于比较两个属性|对应”field<=field”SQL表达?
                  Expression.and对应SQL语句的And关系l合Q如QExpression.and(Expression.eq(“name”,”zx”),Expression.eq(“sex”,”1”));
                  Expression.or对应SQL语句的Or关系l合Q如QExpression.or(Expression.eq(“name”,”zx”),Expression.eq(“name”,”zhaoxin”));
                  Expression.sql作ؓ补充q个Ҏ提供了原生SQL语句查询的支持,在执行时直接通过原生SQL语句q行限定Q如QExpression.sql(“lower({alias}.name)
                  like (?)”,“zhao%”,Hibernate.STRING) ;在运行时{ alias
                  }会由当前查询所兌的实体类名替换,()中的?会?#8221;zhao%”替换Qƈ且类型由Hibernate.STRING指定?

            注意QExpression各方法中的属性参敎ͼ各方法中的第一个参敎ͼ所指定的属性名Uͼ如:name,sexQ,q不是数据库表中的实际字D名Uͼ而是实体对象中映实际数据表字段的类属性名U?
            
            2、示例查询:
              
            CZ查询是通过ExamplecL完成的,ExamplecdCCriterion接口Q可以用作Criteria查询条gQExamplecȝ作用是:Ҏ已有对象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”);
            }
            上述代码中User exampleuser=new
            User(“zx”);criteria.add(Example.create(exampleuser));两句相当?
            criteria.add(Expression.eq(“name”,”zx”));因此会生成类似如下的SQL语句Q?
            select * from user where name=’zx’;在上面的代码中exampleuserUCؓCZ对象?
             
            在Hibernate中队CZ查询Q默认情况下会排除掉CZ对象中属性gؓI的属性,q可以调用Example.excludeNoneQ排除空串|/excludeZerosQ排除零|Q或者调用Example.excludePropertyҎ来指定排除特定属性?
              
            CZ查询主要应用于组合查询中Q比如根据用戯入的查询条g动态生成最l的查询语句Q通过使用CZ查询Q可以避免由于查询条件过多而写的大量if判断语句?
            3、复合查询:
            复合查询主要是处理,h兌关系的两个实体怎样q行兌查询Q比如User实体对象与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处Ӟ表明要针对User对象的addresses属性添加新的查询条Ӟ因此当执行criteria.list()ӞHibernate会生成类似如下的SQL语句Q?
            Select * from user inner join address on user.id=address.id where
            address.address like ‘%shanghai%’;
            正如我们所见,我们可以通过向Criteria中添加保存关联对象的集合属性(addresses属性保存与User对象相关联的Address对象Q,来构造复合查询,在数据库一端是通过内连接查询来实现?
            
            
            
            4、Criteria的高U特性:
            A、限定返回记录条敎ͼ
             我们可以通过利用Criteria.setFirstResult/setMaxResultҎ来限定返回某一ơ查询的记录敎ͼ如下代码Q?
            Criteria criteria=session.createCriteria(User.class);
            criteria.setFirstResult(100);
            criteria.setMaxResult(200);
            通过以上代码可以讑֮该次查询q回user表中的从W?00条记录开始直到第200条记录结束的100条记录?
            B、对查询l果q行排序Q?
             可通过使用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();

            通过使用Ordercȝasc()/desc()ҎQ可以指定针Ҏ个字D늚排序逻辑Q如果执行上qC码,会生成类似如下的SQL语句Q?
            Select * from user where groupid=’2’ order by name asc,groupid desc
            C、分l与l计Q?
              
            在Hibernate3中,对Criteria又增M新功能,可以支持分组与统计功能,在Hibernate3中增加了Projections以及ProjectionListc,q两个类对分l与l计功能q行了封装,如下代码Q?
            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?Q处的代码,我们通过ProjectionscL定了用于分组的目标属性,当进行检索时Hibernate会生成类似如下的SQL语句Q?
            Select age from user group by age;
            q可以通过使用Projections的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?Q处的代码,我们实现了对用户q_q龄的统计,当进行检索时QHibernate会生成类似如下的SQL语句Q?
            Select avg(age) from user;
            另外Q在SQL语句中的多条件分l与l计功能Q可以利用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行索时QHibernate会生成类似如下的SQL语句Q?
            Select age,count(*) from user group by age;
            5、DetachedCriteria:
            在Hibernate2中,Criteria实例是与创徏它的Session实例h相同的生命周期的Q也是_Session实例是它所创徏的Criteria实例的宿主,当Session关闭Ӟ寄生于Session实例的Criteria都将失效。这对Criteria的重用造成了困难,Z实现Criteria实例的重用,在Hibernate3中提供了一个DetachedCriteriac,DetachedCriteria实例的生命周期与Session实例的生命周期无养I我们可以利用DetachedCriteria对一些常用的Criteria查询条gq行抽离Q当需要进行检索时再与Session实例兌Q从而获得运行期的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与当前的Session实例兌q获得运行期的Criteria实例Q完成检索?
            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,实现了添加子查询的功能,我们DetachedCriteria所讑֮的查询条Ӟ当作子查询添加到了运行时Criteria实例的查询条件中Q当执行索时Hibernate会生成类似如下的SQL语句Q?
            Select * from user where age>(select avg(age) from user group by
            age);


]]>
用hibernate search增量索引http://www.aygfsteel.com/fangts/archive/2008/01/09/174020.htmlҎ?/dc:creator>Ҏ?/author>Wed, 09 Jan 2008 07:14:00 GMThttp://www.aygfsteel.com/fangts/archive/2008/01/09/174020.htmlhttp://www.aygfsteel.com/fangts/comments/174020.htmlhttp://www.aygfsteel.com/fangts/archive/2008/01/09/174020.html#Feedback0http://www.aygfsteel.com/fangts/comments/commentRss/174020.htmlhttp://www.aygfsteel.com/fangts/services/trackbacks/174020.html

package cn.search.pojo;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.search.annotations.DocumentId;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Index;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.Store;

@Entity
@Table(name = "search_foo")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Indexed(index = "search_foo")
public class Foo implements Serializable {

 /**
  *
  */
 private static final long serialVersionUID = 1L;
 @Id
 @DocumentId
 @Field(name = "id", index = Index.TOKENIZED, store = Store.YES)
 private Integer id;

 @Column(nullable = false, length = 200)
 @Field(name = "name", index = Index.TOKENIZED, store = Store.YES)
 private String name;

 @Column(nullable = false, length = 200)
 @Field(name = "title", index = Index.TOKENIZED, store = Store.YES)
 private String title;

 public Integer getId() {
  return id;
 }

 public void setId(Integer id) {
  this.id = id;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public String getTitle() {
  return title;
 }

 public void setTitle(String title) {
  this.title = title;
 }
}

2、配|文?br />

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd" >
<hibernate-configuration>
 <session-factory>
  <property name="hibernate.dialect">
   org.hibernate.dialect.Oracle9Dialect
  </property>
  <property name="hibernate.connection.url">
   jdbc:oracle:thin:@192.168.0.21:1521:oradb
  </property>
  <property name="hibernate.connection.username">
   goodsres
  </property>
  <property name="hibernate.connection.password">
   goodsres
  </property>
  <property name="hibernate.connection.driver_class">
   oracle.jdbc.driver.OracleDriver
  </property>

  <property name="hibernate.search.default.directory_provider">
   org.hibernate.search.store.FSDirectoryProvider
  </property>
  <property name="hibernate.search.default.indexBase">
   e:/index
  </property>
  <property name="hibernate.cache.provider_class">
   org.hibernate.cache.HashtableCacheProvider
  </property>

  <mapping class="cn.search.pojo.Foo" />

 </session-factory>

</hibernate-configuration>
3、测试代?br />

package cn.search.manager;

import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertTrue;

import java.util.List;

import org.apache.lucene.analysis.StopAnalyzer;
import org.apache.lucene.queryParser.QueryParser;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;


import cn.search.pojo.Foo;

public class SearchResultsHibernate {
 private static SessionFactory sf = null;

 private static Session session = null;

 private static Transaction tx = null;

 @BeforeClass
 public static void setupBeforeClass() throws Exception {
  sf = new AnnotationConfiguration().configure("hibernate.cfg.xml")
    .buildSessionFactory();
  assertNotNull(sf);
 }

 @Before
 public void setUp() throws Exception {
  session = sf.openSession();
  tx = session.beginTransaction();
  tx.begin();
 }

 @After
 public void tearDown() throws Exception {
  tx.commit();
  session.close();
 }

 public static void tearDownAfterClass() throws Exception {
  if (sf != null)
   sf.close();
 }

 @Test
 public void testAddDept() throws Exception {
  Foo foo = new Foo();

  foo.setId(1);

  foo.setName("W一个hibernate search");

  foo.setTitle("好好学习Q天天向?);

  session.delete(foo);
 }

 @Test
 public void testIndex() throws Exception {
  FullTextSession fullTextSession = Search.createFullTextSession(session);
  assertNotNull(session);

  QueryParser parser = new QueryParser("title", new StopAnalyzer());
  org.apache.lucene.search.Query luceneQuery = parser.parse("好好学习");
  Query hibQuery = fullTextSession.createFullTextQuery(luceneQuery,
    Foo.class);

  List list = hibQuery.list();

  assertTrue(list.size() > 0);
 }

 public static void main(String[] args) {

  try {
   setupBeforeClass();
   SearchResultsHibernate searchResults = new SearchResultsHibernate();
   searchResults.setUp();
   searchResults.testAddDept();
   searchResults.tearDown();
   SearchResultsHibernate.tearDownAfterClass();

  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}



]]>
hibernate+spring整合http://www.aygfsteel.com/fangts/archive/2007/12/20/168929.htmlҎ?/dc:creator>Ҏ?/author>Thu, 20 Dec 2007 01:28:00 GMThttp://www.aygfsteel.com/fangts/archive/2007/12/20/168929.htmlhttp://www.aygfsteel.com/fangts/comments/168929.htmlhttp://www.aygfsteel.com/fangts/archive/2007/12/20/168929.html#Feedback0http://www.aygfsteel.com/fangts/comments/commentRss/168929.htmlhttp://www.aygfsteel.com/fangts/services/trackbacks/168929.htmlSpring Framework最得以出名的是与Hibernate的无~链接,基本上用SpringQ就会用Hibernate。可惜的是Spring提供的HibernateTemplate功能昑־不够Q用v来也不是很方ѝ我们编E序Ӟ一般先写BusinessServiceQ由BusinessService调DAO来执行存储,在这斚wSpring没有很好的例子,造成真正想用好它Qƈ不容易?/p>

我们的思\是先写一个BaseDaoQ仿照HibernateTemplateQ将基本功能全部实现Q?/p>

public class BaseDao extends HibernateDaoSupport{

    private Log log = LogFactory.getLog(getClass());

    public Session openSession() {
        return SessionFactoryUtils.getSession(getSessionFactory(), false);
    }

    public Object get(Class entityClass, Serializable id) throws DataAccessException {
        Session session = openSession();
        try {
            return session.get(entityClass, id);
        }
        catch (HibernateException ex) {
            throw SessionFactoryUtils.convertHibernateAccessException(ex);
        }
    }

    public Serializable create(Object entity) throws DataAccessException {
        Session session = openSession();
        try {
            return session.save(entity);
        }
        catch (HibernateException ex) {
            throw SessionFactoryUtils.convertHibernateAccessException(ex);
        }
    }

...

其它的DAOQ从BaseDaol承出来Q这样写其他的DAOQ代码就会很?/p>

从BaseDaol承出来EntityDaoQ专门负责一般实体的基本操作Q会更方ѝ?/p>

public interface EntityDao {

    public Object get(Class entityClass, Serializable id) throws DataAccessException;

    public Object load(Class entityClass, Serializable id) throws DataAccessException;

    public Serializable create(Object entity) throws DataAccessException;
...}

/**
 * Base class for Hibernate DAOs.  This class defines common CRUD methods for
 * child classes to inherit. User Sping AOP Inteceptor
 */
public class EntityDaoImpl extends BaseDao implements EntityDao{

}

ZTransaction的控Ӟ采用AOP的方式:

public interface EntityManager {

    public Object get(Class entityClass, Serializable id);

    public Object load(Class entityClass, Serializable id);

    public Serializable create(Object entity);
...

}

/**
 * Base class for Entity Service. User Sping AOP Inteceptor
 */
public class EntityManagerImpl implements EntityManager {

    private EntityDao entityDao;

    public void setEntityDao(EntityDao entityDao) {
        this.entityDao = entityDao;
    }

    public Object get(Class entityClass, Serializable id) {
        return entityDao.get(entityClass, id);
    }

    public Object load(Class entityClass, Serializable id) {
        return entityDao.load(entityClass, id);
    }
...

}

q样我们有了一个通用的Hibernate实体引擎Q可以对MHibernate实体实现基本的增加、修攏V删除、查询等?/p>

其它的BusinessService可以承EntityManagerQ快速实C务逻辑?/p>

具体XML配置如下Q?/p>

 <!-- Oracle JNDI DataSource for J2EE environments -->
 <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName"><value>java:comp/env/jdbc/testPool</value></property>
 </bean>

 <!-- Hibernate SessionFactory for Oracle -->
 <!-- Choose the dialect that matches your "dataSource" definition -->
 <bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
  <property name="dataSource"><ref local="dataSource"/></property>
  <property name="mappingResources">
   <value>user-hbm.xml</value>
  </property>
  <property name="hibernateProperties">
   <props>
    <prop key="hibernate.dialect">net.sf.hibernate.dialect.OracleDialect</prop>
    <prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.Provider</prop>
    <prop key="hibernate.cache.use_query_cache">true</prop>
                  <prop key="hibernate.show_sql">false</prop>
   </props>
  </property>
 </bean>

 <!-- AOP DAO Intecepter -->
        <bean id="hibernateInterceptor" class="org.springframework.orm.hibernate.HibernateInterceptor">
          <property name="sessionFactory">
            <ref bean="sessionFactory"/>
          </property>
        </bean>

        <bean id="entityDaoTarget" class="com.gpower.services.entity.dao.EntityDaoImpl">
          <property name="sessionFactory">
            <ref bean="sessionFactory"/>
          </property>
        </bean>

        <bean id="entityDao" class="org.springframework.aop.framework.ProxyFactoryBean">
          <property name="proxyInterfaces">
            <value>com.gpower.services.entity.dao.EntityDao</value>
          </property>
          <property name="interceptorNames">
            <list>
              <value>hibernateInterceptor</value>
              <value>entityDaoTarget</value>
            </list>
          </property>
        </bean>

 <!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
 <bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
  <property name="sessionFactory"><ref local="sessionFactory"/></property>
 </bean>

 <!-- Transaction manager that delegates to JTA (for a transactional JNDI DataSource) -->
 <!--
 <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>
 -->

 <!-- Transactional proxy for the Application primary business object -->
        <bean id="entityManagerTarget" class="com.gpower.services.entity.EntityManagerImpl">
          <property name="entityDao">
            <ref bean="entityDao"/>
          </property>
        </bean>

        <bean id="entityManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
          <property name="transactionManager">
            <ref bean="transactionManager"/>
          </property>
          <property name="target">
            <ref bean="entityManagerTarget"/>
          </property>
          <property name="transactionAttributes">
     <props>
       <prop key="get*">PROPAGATION_SUPPORTS</prop>
       <prop key="*">PROPAGATION_REQUIRED</prop>
     </props>
          </property>
        </bean>



]]>
վ֩ģ壺 ʶ| | | | | | | ¡| ɽ| | ԭ| Ȫ| | | | | | | | | | ɳ| Ƹ| | | ƽ| | | | | | ɽ| | ƽ| | ͷ| ɽ| | | ۽| |