2012-08-11 46 views
0

我使用spring mvc并创建了CRUD功能。但我想创建一个搜索函数,使我能够通过任何参数(变量)查找用户,如'用户名'或'用户名'或'姓氏'或'社会安全号码'或其他。如何编写一个搜索类来接受任何类型的参数?

我的用户名是一个整数类型。

我该怎么做?什么是SQL查询?

如何检查输入是整数还是字符串,然后通过给定参数遍历数据库并搜索用户?

抽象DAO类:

为实体
public abstract class AbstractHibernateDAO<T> { 

    private static final String PARAM_VALUE_PARAMETER = "paramValue"; 

    private final Class<T> clazz; 

    @Autowired 
    private SessionFactory sessionFactory; 

    public AbstractHibernateDAO(Class<T> clazz) { 
     this.clazz = clazz; 
    } 

    public T findOne(String paramName, Object paramValue) { 
     Session session = sessionFactory.getCurrentSession(); 

     @SuppressWarnings("unchecked") 
     T fetchedObject = (T) session.createCriteria(clazz).add(Restrictions.eq(paramName, paramValue)).uniqueResult(); 

     return fetchedObject; 
    } 

    // Other CRUD methods. 

} 

具体DAO类:

@Repository 
@Transactional 
public class ProductHibernateDAO extends AbstractHibernateDAO<Product> { 

    public ProductHibernateDAO() { 
     super(Product.class); 
    } 

} 

回答

1

如果你正在使用Hibernate进行数据访问,你可以使用标准的API轻松创建通用取景器或者,如果您更喜欢使用HQL而不是Criteria API,则可以将搜索方法重写为:

public T findOne(String paramName, Object paramValue) { 
    Session session = sessionFactory.getCurrentSession(); 

    StringBuilder queryText = new StringBuilder(); 

    queryText.append("from "); 
    queryText.append(clazz.getSimpleName()); 
    queryText.append(" where "); 
    queryText.append(paramName); 
    queryText.append("=:"); 
    queryText.append(PARAM_VALUE_PARAMETER); 

    @SuppressWarnings("unchecked") 
    T fetchedObject = (T) session.createQuery(queryText.toString()).setParameter(PARAM_VALUE_PARAMETER, paramValue).uniqueResult(); 

    return fetchedObject; 
} 

In this article你可以找到非常好的描述如何用hibernate创建泛型DAO(或者如果你更喜欢JPA,那么也描述了如何使用JPA来实现这一点)。

或者,如果您更愿意使用JDBC进行数据访问,我建议您查看Spring的JdbcTemplate。它大大简化了开发。在这里如何使用的JdbcTemplate实现通用取景器:

@Repository 
@Transactional 
public class ProductJDBCDAO implements DAO<Product> { 

    private static final String TABLE_NAME = "product"; 

    @Autowired 
    private JdbcTemplate jdbcTemplate; 

    public Product findOne(String paramName, Object paramValue) { 
     RowMapper<Product> rowMapper = new RowMapper<Product>(){ 

      public Product mapRow(ResultSet rs, int rowNum) throws SQLException { 

       long productId = rs.getLong("product_id"); 
       // Other properties 

       Product product = new Product(...); 

       return product; 
      } 

     }; 

     StringBuilder queryText = new StringBuilder(); 
     queryText.append("select * from "); 
     queryText.append(TABLE_NAME); 
     queryText.append(" where "); 
     queryText.append(paramName); 
     queryText.append("=?"); 

     Product fetchedObject = jdbcTemplate.queryForObject(queryText.toString(), rowMapper, paramValue); 

     return fetchedObject; 
    } 


    // Other CRUD methods 
} 

屁股,你可以在你并不需要显式指定参数类型的所有例子看,你只需要添加它作为对象的参数。

如果你将在这样的情况下直接使用JDBC的工作,我建议你使用PreparedStatement的这是的setObject(..)方法。查询文本将类似于JdbcTemplate示例中所示。

+0

谢谢这是非常有帮助的。 – user1067665 2012-08-13 17:45:39

相关问题