[英]How to avoid executing the query multiple times?
假设我的DAO中有这个nativeQuery:
SELECT a, b, c FROM table
返回我需要的所有值。
问题是我有太多结果, 我需要查询仅运行一次,而不是为找到的每一行运行。
我正在检索查询结果并将所有值设置为一个名为Class
的类(值对象),如下所示:
public List<Class> listClass() {
List<Class> listaObjs;
String nativeQuery = "SELECT a, b, c FROM table";
SQLQuery q = getSession().createSQLQuery(nativeQuery);
int totalRecords = q.list().size();
System.out.println("Total records: " + totalRecords);
listaObjs = q.list();
// For every ROW in query Result
for (int i = 0; i < totalRecords; i++) {
Object[] objs = (Object[]) q.list().get(i);
Class item = new Class();
// For every COLUMN in that ROW
for (Object obj : objs) {
item.setValueA((String) objs[0]);
item.setValueB(((String) objs[1]));
item.setValueC(((String) objs[2]));
listaObjs.add(item);
}
}
return listaObjs;
}
我有点卡在这里,因为我以前从未处理过Object[]
进行Class
强制转换。
更改以下行
// For every ROW in query Result
for (int i = 0; i < totalRecords; i++) {
Object[] objs = (Object[]) q.list().get(i);
采用
List<Object[]> objArr = q.list();
// For every ROW in query Result
for (int i = 0; i < totalRecords; i++) {
Object[] objs = (Object[]) objArr.get(i);
您的代码具有很多性能和编程问题。 请尝试以下。
public List<Class> listClass() {
List<Class> listaObjs = new ArrayList<Class>();
String nativeQuery = "SELECT a, b, c FROM table";
SQLQuery q = getSession().createSQLQuery(nativeQuery);
List<Object[]> totalRecords = q.list();
System.out.println("Total records: " + totalRecords.size());
for (Object[] objects : totalRecords) {
Class item = new Class();
item.setValueA((String) objs[0]);
item.setValueB(((String) objs[1]));
item.setValueC(((String) objs[2]));
listaObjs.add(item);
}
return listaObjs;
}
此代码将在每次迭代时重新运行查询:
Object[] objs = (Object[]) q.list().get(i);
您已经使用listaObjs = q.list();
获得了列表listaObjs = q.list();
,因此请在listaObjs
内处理listaObjs
:
for (int i = 0; i < totalRecords; i++) {
Object[] objs = (Object[])listaObjs.get(i);
您应该在循环外部调用q.list()
。 然后,您应该遍历返回的ResultSet
,这应该是您的循环。 了解如何通过ResultSet
(或也许通过您使用的API返回的List
正确进行迭代。
不要每次都调用q.list,只需一次,然后将结果存储在List变量中。 (q.list()执行sql,但是您不必每次都使用它)
List resultList = q.list();
int totalRecords = resultList.size();
等等...
您可以考虑使用迭代代替for循环,也许SqlQuery有一个迭代方法,如果没有,则遍历整个列表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.