如何避免多次执行查询?
How to avoid executing the query multiple times?
假设我的 DAO 中有这个 nativeQuery:
SELECT a, b, c FROM table
其中 returns 我需要的所有值。
问题是我的结果太多,我只需要查询 运行 一次 而不是 运行ning 找到的每一行。
我正在检索查询结果并将所有值设置到一个名为 Class
的 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
转换。
您应该在循环外调用 q.list()
。然后你应该遍历返回的 ResultSet
,这应该是你的循环。阅读如何正确地遍历 ResultSet
(或者可能通过您正在使用的 API 返回的 List
)。
此代码将在每次迭代时重新运行查询:
Object[] objs = (Object[]) q.list().get(i);
您已经通过 listaObjs = q.list();
获得了列表,因此在循环内处理 listaObjs
:
for (int i = 0; i < totalRecords; i++) {
Object[] objs = (Object[])listaObjs.get(i);
更改以下行
// 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;
}
不要每次都调用q.list,只调用一次并将结果存储在一个列表变量中。 (q.list() 执行 sql,但你不需要每次都需要它)
List resultList = q.list();
int totalRecords = resultList.size();
等等...
您可以考虑使用 iterate 而不是 for 循环,也许 SqlQuery 有一个 iterate 方法,如果没有,则在列表上迭代。
假设我的 DAO 中有这个 nativeQuery:
SELECT a, b, c FROM table
其中 returns 我需要的所有值。
问题是我的结果太多,我只需要查询 运行 一次 而不是 运行ning 找到的每一行。
我正在检索查询结果并将所有值设置到一个名为 Class
的 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
转换。
您应该在循环外调用 q.list()
。然后你应该遍历返回的 ResultSet
,这应该是你的循环。阅读如何正确地遍历 ResultSet
(或者可能通过您正在使用的 API 返回的 List
)。
此代码将在每次迭代时重新运行查询:
Object[] objs = (Object[]) q.list().get(i);
您已经通过 listaObjs = q.list();
获得了列表,因此在循环内处理 listaObjs
:
for (int i = 0; i < totalRecords; i++) {
Object[] objs = (Object[])listaObjs.get(i);
更改以下行
// 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;
}
不要每次都调用q.list,只调用一次并将结果存储在一个列表变量中。 (q.list() 执行 sql,但你不需要每次都需要它)
List resultList = q.list();
int totalRecords = resultList.size();
等等...
您可以考虑使用 iterate 而不是 for 循环,也许 SqlQuery 有一个 iterate 方法,如果没有,则在列表上迭代。