什么时候标准比HQL或nativeSQL Query更好?

时间:2016-01-08 23:17:28

标签: java hibernate

在获得某个列表之后,我需要迭代该列表以设置POJO类的其他字段。

 if (transportHeaderList.get(i) instanceof TransportHeaderIiss){
     transHeadIiss=(TransportHeaderIiss)transportHeaderList.get(i);
     customerVendor= tOManagementDAO.getVendorCode(transHeadIiss.getCustVendUid());
 }
 if(customerVendor!=null){
     transHeadIiss.setVendorCode(customerVendor.getCustVendCode());
 }

上面的代码调用getVendorCode方法从数据库中获取custVendorCode值。 getVendorCode的代码如下

public CustomerVendorIiss getVendorCode(Long custVendUid) {
    List list=new ArrayList();
    /* Criteria criteria = sessionFactory.getCurrentSession().createCriteria(CustomerVendorIiss.class);

     criteria.add(Restrictions.eq("companyCode",user.getDefaultCompany().getCompanyCode()));
     if(custVendUid!=null && custVendUid.intValue()>0)
     {
         criteria.add(Restrictions.eq("custVendUid",custVendUid));

     }
     list=criteria.list();*/
     UsersIiss user= ApplicationContextProvider.getLoggedInUser();
     String sqlQuery="select custVendCode as custVendCode from CustomerVendorIiss where companyCode ='"+ user.getDefaultCompany().getCompanyCode() +"' and custVendUid= "+custVendUid;
     Query query = sessionFactory.getCurrentSession().createQuery(sqlQuery);
     query.setResultTransformer(Transformers.aliasToBean(CustomerVendorIiss.class));
     list=query.list();
        if(list.size()>0){
        return (CustomerVendorIiss)list.get(0);
        }else{
        return null;
        }
}

当我使用条件执行上面的代码时,花了很多时间从表中获取值并将其设置为POJO类,有时我会得到java.lang.OutOfMemoryError: Java heap space错误。我猜那是因为我没有取消分配标准对象。

当我使用createQuery()方法执行上述代码时,我没有遇到该问题,所有获取和设置过程都更快。

我想知道我在这里做错了什么? 很高兴知道标准如何以及何时更好或HQL更好?

谢谢!

1 个答案:

答案 0 :(得分:0)

实际上这些查询是不同的。第二个有额外的限制

companyCode ='"+ user.getDefaultCompany().getCompanyCode() +"'

因此,请尝试将相同的内容添加到条件

criteria.add(Restrictions.eq("companyCode",user.getDefaultCompany().getCompanyCode()));

以这种方式连接字符串以获取查询也不是上帝。 SQL注入是可能的。改为使用参数。

在一种情况下,Criteria和HQL优于SQL - 您需要DB独立逻辑来在必要时交换数据库而无需重写代码。