1

次の基準クエリがあります。

    String cat = "H";
    Criteria criteria = currentSession().createCriteria(this.getPersistentClass()).
            add(Restrictions.ne("category", cat)).
            createAlias("employees", "emp").
            createAlias("emp.company", "company");
    Disjunction disjunction = Restrictions.disjunction();
    for(Region r: regions){
           disjunction.add(Restrictions.eq("company.region", r));
    }
    criteria.add(disjunction);

    if(status != null) {
        criteria.add(Restrictions.eq("status", status));
    }

    if (period != null) {
        criteria.add(Restrictions.eq("period", period));
    }

    criteria.setProjection(Projections.groupProperty("id")) //this line was added to try to "fix" the error, but it still happened.
    criteria.addOrder(Order.asc("id"));

私の基準クエリを説明するクエリは次のようになると思います。

  select n.* from NOMINATION n
  join NOMINEE i on n.NOM_ID = i.NOM_ID
  join EMPLOYEE e on e.EMP_ID = i.EMP_ID
  join COMPANY c on c.COMPANY_CODE = e.COMPANY_CODE
  where n.CATEGORY_CODE!='H' and (c.REGION_ID = ? or c.REGION_ID = ? or c.REGION_ID = ?) and n.STATUS_ID = ? and n.PERIOD_ID = ?
  order by n.NOM_ID

ここでやろうとしていることはかなり紛らわしいですが、この特定の行を追加する場合を除いて、ほとんどの場合は機能します (ただし、クエリは正常に機能します)。

 criteria.addOrder(Order.asc("id"));

そして、私はエラーが発生します:

 java.sql.SQLException: Column "NOMINATION.NOM_ID" is invalid in the ORDER BY clause because it is not contained in either an aggregate function or the GROUP BY clause.

これは、SQL-SERVER と関係があると思われます。私はすでに でグループ化していますid。ここで何が間違っているのでしょうか、それとも HQL を使用する必要がありますか?

4

1 に答える 1

1

現在のクエリは、グループ関数が使用されていないか、グループごとのクエリではない単純なクエリのようです。現在の要件によれば、この行を使用する必要はありません。

criteria.setProjection(Projections.groupProperty("id")).addOrder(Order.asc("id"));

または、SQL ステートメントを変更する必要があります。

于 2012-04-13T15:35:43.157 に答える