如何避免多次执行查询?

时间:2015-10-23 19:24:42

标签: java hibernate hibernate-native-query

说我在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施放过{。}}。

5 个答案:

答案 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有一个迭代方法,如果没有,迭代在列表上。