有时候在用hibernate进行查询时,如果sql复杂用sql查询不失为一种好办法。
这里有两个版本的findBySql
public List findBySQL(String sql) {
Session session = null;
try {
session = getHibernateTemplate().getSessionFactory().openSession();
Query query = session.createSQLQuery(sql);
List list = query.list();
return list;
} catch (RuntimeException e) {
log.error("error", e);
throw e;
} finally {
if(session != null) {
session.clear();
session.close();
getHibernateTemplate().getSessionFactory().close();
}
public List findBySQL(String sql, Class clazz) {
Session session = null;
try {
session = getHibernateTemplate().getSessionFactory().openSession();
Query query = session.createSQLQuery(sql).addEntity(clazz);
List list = query.list();
return list;
} catch (RuntimeException e) {
log.error("error", e);
throw e;
} finally {
if (session != null) {
session.clear();
session.close();
getHibernateTemplate().getSessionFactory().close();
}
Query query = session.createSQLQuery(sql).addEntity("a",实体1).addEntity("b",实体2)
对于分页可以针对数据库进行设置:如mysql 可以加上 limit 0,20或者在Query对象上设置分页
query.setFirstResult(0)
query.setMaxResults(20)
用sql的话返回来的是一个数组
List<Object[]> pds = productDoingDao.findBySQL(sql);
List<ProductDoingVo> pdvs = new ArrayList<ProductDoingVo>();
Integer repositoryId = 0;
for(Object[] datas : pds){
ProductDoingVo pdv = new ProductDoingVo();
pdv.setOrderNo(String.valueOf(datas[0]));
pdv.setProductDoingId(Integer.parseInt(String.valueOf(datas[1])));
pdv.setSn(String.valueOf(datas[2]));
repositoryId = 0;
if (datas[3] != null) {
repositoryId = Integer.parseInt(String.valueOf(datas[3]));
}else if (datas[4] != null) {
repositoryId = Integer.parseInt(String.valueOf(datas[4]));
TRepository repository = repositoryService.findById(repositoryId);
if(null!=repository){
pdv.setRepositoryName(repository.getName());
pdvs.add(pdv);
}
如果在select中关联几个表中有相同的字段请分别为各字段设置别名否则会出现意想不到的情况。
如
a.ORDER_NO,a.PRODUCT_DOING_ID,a.SN,b.REPOSITORY_ID as a_repository,c.REPOSITORY_ID as b_repository
b表和c表都有REPOSITORY_ID字段,但他们是独立的,如b表的REPOSITORY_ID为3,c表的REPOSITORY_ID可能为空,如果不设置别名的话,会导致b表和c表的数组值REPOSITORY_ID都为3