在获得某个列表之后,我需要迭代该列表以设置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更好?
谢谢!
答案 0 :(得分:0)
实际上这些查询是不同的。第二个有额外的限制
companyCode ='"+ user.getDefaultCompany().getCompanyCode() +"'
因此,请尝试将相同的内容添加到条件
criteria.add(Restrictions.eq("companyCode",user.getDefaultCompany().getCompanyCode()));
以这种方式连接字符串以获取查询也不是上帝。 SQL注入是可能的。改为使用参数。
在一种情况下,Criteria和HQL优于SQL - 您需要DB独立逻辑来在必要时交换数据库而无需重写代码。