1

SQL クエリを基準 (Hibernate 3.3.2) に変換して永続化レイヤーで使用したい。それがクエリです:

select last_name
  from member
  where
    member.end_date > SYSDATE
  group by member.last_name
  having count(member.last_name) >1;

私はすでに多くの組み合わせを試していますが、私にとって良い結果はありません...これは私のコードです:

Criteria criteria = getSession(false).createCriteria(Member.ENTITY_NAME);
criteria.setProjection(Projections.projectionList()
            .add(Projections.groupProperty("lastName"))
            .add(Projections.count("lastName").as("cptLastName"))
            );
criteria.add(Restrictions.ge("endDate", now))
            .add(Restrictions.le("startDate", now))
            //.add(Restrictions.gt("cptLastName", new Integer(1)))
            .addOrder(Order.asc("lastName"))
;

コメント行で書くと、名前とその名前がデータベースに表示される回数を含むオブジェクト リストができます。しかし、コメントを解除したい場合、これはエラーです: java.sql.SQLException: ORA-00904: "Y1_": 無効な識別子

このコードを開発するために、私は以下の別の投稿に触発されました:

私は解決にはほど遠いと思いますが、私を助ける人はいますか? ご不明な点がございましたら、お気軽にお問い合わせください。このクエリに貼り付ける別の回避策が見つかった場合は、遠慮なく提案してください...

4

3 に答える 3

1

こんにちは、私が正しければ、現在、休止状態の基準で直接having句カウントを使用することはできません。変更されたクエリの下を見つけてください。うまくいかない場合は、スタックトレース全体を投稿してください

DetachedCriteria innerQuery = DetachedCriteria.forClass(Member.ENTITY_NAME, "inner");
  innerQuery.setProjection(Projections.rowCount());
  innerQuery.add(Restrictions.eqProperty("lastName", "outer.lastName"));

  Criteria c = s.createCriteria(Member.ENTITY_NAME, "outer");
  c.setProjection(Projections.property("lastName"));
  c.add(Restrictions.gt("endDate", now))   
  c.add(Subqueries.eq(new Integer(1), innerQuery));
于 2012-09-04T12:29:23.333 に答える
0

私はあなたの提案に私のコードを適応させました、そしてこれは私が持っているものです:

DetachedCriteria innerQuery = DetachedCriteria.forEntityName(Member.ENTITY_NAME,"inner")
    .setProjection(Projections.rowCount())
    .add(Restrictions.eqProperty("lastName", "outer.lastName"));

Criteria criteria = getSession(false).createCriteria(Member.ENTITY_NAME, "outer")
    .setProjection(Projections.property("lastName"))
    .add(Restrictions.g("endDate", now))
    .add(Subqueries.gt(new Integer(1), innerQuery));

したがって、上記のコメントで述べたように、それは機能しますが、長い時間がかかります...私に間違った結果を与えるために(それは私に8つのレコードを与えるはずです)。

Hibernateクエリを表示するオプション(hibernate.show_sql = true)をアクティブにしました。そしてそれをSQLクエリ形式でフォーマットすると、これは実行できるということです:

select this.last_name
from member this 
where this.END_DATE>=SYSDATE 
and 1 > 
    (select count(*) 
    from member inner  
    where inner.last_name = this.last_name);

それで、私が望む結果を私に与えるためにこのクエリで何ができるでしょうか?

于 2012-09-05T09:20:04.963 に答える
0

実際、私はあなたの答えで部分的に成功しています...なぜなら、私は私の大きな要求の一部しか表示していないからです. それはこのようなものです:

select member.last_name, member.first_name, 
from member
where  
  member.end_date > SYSDATE
and
  member.last_name in 
  (select member.last_name
  from member 
  where
    member.end_date > SYSDATE
  group by member.last_name
  having count(member.last_name) >1)
order by member.last_name;

また、データベース内で同名 (同名) を持つすべてのメンバーを表示します。参考までに、これが私の最終的な基準です。

Calendar now = Calendar.getInstance();
DetachedCriteria innerQuery = DetachedCriteria.forEntityName(Member.ENTITY_NAME,"inner")
        .setProjection(Projections.rowCount())
        .add(Restrictions.eqProperty("lastName", "outer.lastName"))
        .add(Restrictions.ge("endDate", now));

Criteria criteria = getSession(false).createCriteria(Member.ENTITY_NAME, "outer")
        .setProjection(Projections.property("lastName"))                
        .add(Restrictions.ge("endDate", now))
        .add(Subqueries.lt(new Integer(1), innerQuery));

少し説明すると、プロジェクションを使用して、行数を数え、(select の) 姓をプライマリ クエリの姓と比較します。また、一次基準の 2 行目は常に必要です。サブクエリ (DetachedCriteria) を使用する場合は、射影を使用する必要があります。しかし、最終的には、HQL クエリを使用してコードを実行します。これは、基準が機能するのがより重いためです...

では、ご回答よろしくお願いいたします...

于 2012-09-12T13:02:51.080 に答える