0

私はSQLで次のようなクエリを作成しました...

SELECT c.clientfirstname, 
       c.clientlastname, 
       c.clientage, 
       c.status, 
       Sum(i.annualamount) AS amount, 
       p.planname, 
       c.clientid 
FROM   client c, 
       income i, 
       plan p 
WHERE  c.clientid = i.clientid 
       AND planid = (SELECT Max(p.planid) 
                     FROM   plan p 
                     WHERE  c.clientid = p.clientid 
                     GROUP  BY p.clientid) 
       AND ( c.clientfirstname LIKE 'rahul' ) 
GROUP  BY i.clientid 

このクエリは正常に機能していますが、アプリケーションで休止状態を使用しているため、上記の SQL クエリの代わりに休止状態の基準クエリを使用したいと考えています。planId=(SELECT MAX(p.planId) FROM plan p WHERE c.clientId=p.clientId GROUP BY p.clientId)ハイバネート基準で上記のSQLクエリを記述する方法のような条件を追加しているときに問題が発生しています。私はこのクエリで試しました

DetachedCriteria dc = DetachedCriteria.forClass(Client.class);
    dc.createAlias("plans", "pla");
    ProjectionList proj = Projections.projectionList();
    proj.add(Projections.max("pla.planId"));
        proj.add(Projections.groupProperty("clientId"));
    dc.setProjection(proj);


    Criteria criteria =      sessionFactory.getCurrentSession().createCriteria(Client.class);
    criteria.createAlias("incoms", "inco");
    criteria.createAlias("plans", "plan");

    Criterion firstname = Restrictions.like("clientFirstName", searchValue+"%");

    criteria.setProjection(
            Projections.projectionList()            
            .add(Projections.property("clientFirstName"))
            .add(Projections.property("clientLastName"))
            .add(Projections.property("clientAge"))
            .add(Projections.property("status"))
            .add(Projections.sum("inco.annualAmount"))
                .add(Projections.property("plan.planName"))
            .add(Projections.groupProperty("clientId"))
            );

    criteria.add(Subqueries.propertyEq("plan.planId", dc));

    Disjunction disjunction = Restrictions.disjunction();

    disjunction.add(firstname);

    criteria.add(disjunction);

    return criteria.list();
}

しかし、私はこのようなエラーが発生しています.....

Hibernate: 
select this_.clientFirstName as y0_, this_.clientLastName as y1_,
  this_.clientAge as y2_, this_.status as y3_, sum(inco1_.annualAmount) as y4_,
  plan2_.planName as y5_, this_.clientId as y6_ 
from Client this_ inner join Income inco1_ on this_.clientId=inco1_.clientId
  inner join Plan plan2_ on this_.clientId=plan2_.clientId 
where plan2_.planId = 
    (select max(pla1_.planId) as y0_, this_.clientId as y1_ 
     from Client this_ inner join Plan pla1_ on this_.clientId=pla1_.clientId
     group by this_.clientId
    ) 
  and (this_.clientFirstName like ? 
  or this_.clientLastName like ? 
  or this_.clientPhoneNo like ? 
  or this_.clientEmail like ?)
group by this_.clientId

エラー: クエリを実行できませんでした

収入プランとクライアントの 3 つのテーブルがあり、クライアント ID はプラン テーブルと収入テーブルの両方の外部キーであり、プラン テーブルには 1 つのクライアント ID で利用できる多くのプラン名があり、プラン テーブルから clientId で最後のプラン グループを取得したい.. .

私の上記(上)のSQLクエリは問題ないので、休止状態の基準を使用して同じクエリが必要です。

4

0 に答える 0