说我在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
施放过{。}}。
答案 0 :(得分:2)
更改以下行
// 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);
答案 1 :(得分:2)
您的代码有很多性能和程序问题。请尝试以下。
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;
}
答案 2 :(得分:1)
此代码将在每次迭代时重新运行查询:
Object[] objs = (Object[]) q.list().get(i);
您已将列表添加到listaObjs = q.list();
,因此请在循环内处理listaObjs
:
for (int i = 0; i < totalRecords; i++) {
Object[] objs = (Object[])listaObjs.get(i);
答案 3 :(得分:0)
您应该在循环之外调用q.list()
。然后你应该遍历返回的ResultSet
,这应该是你的循环。阅读如何正确迭代ResultSet
(或者通过您正在使用的API返回的List
)。
答案 4 :(得分:0)
每次都不要调用q.list,只需将结果存储在List变量中。 (q.list()执行sql,但每次都不需要它)
List resultList = q.list();
int totalRecords = resultList.size();
依旧......
您可以考虑使用iterate而不是for循环,也许SqlQuery有一个迭代方法,如果没有,迭代在列表上。