6

テーブルからいくつかの列の値だけを取得する必要がありました。だから私はこれを達成するためにプロジェクションを使用しました。コードは機能しますが、効果的だとは思いません。

私の問題は、ProjectionsList を使用してから、criteria.list を ArrayList に設定したときでした。Bulletin オブジェクトは null です。これをうまく説明する方法がわかりません。だから私はコードを入れて、以下を読んでください:

 List<Bulletin> list = new ArrayList<Bulletin>();
 BulletinList bulletinList = null;

 Criteria criteria = null;

 criteria = this.getSession().createCriteria(Bulletin.class)
            .setProjection(Projections.projectionList()
            .add(Projections.property(bulletinIdAttr))
            .add(Projections.property(docNameAttr))   
            .add(Projections.property(docTypeCodeAttr))
            );        
    criteria.addOrder(Order.desc(createdTimeAttr));

    List<Object> rows = criteria.list();
    for (Object r : rows) {
        Object[] row = (Object[]) r;
        Bulletin bull = new Bulletin();
        bull.setBulletinId((Long) row[0]);
        bull.setDocumentName((String) row[1]);
        bull.setDocumentTypeCode((String) row[2]);
        list.add(bull);
      }

    bulletinList = new BulletinList();
    bulletinList.setBulletins(list);

    return bulletinList;

criteria.list を BulletinList (Bulletin オブジェクトのリストを保持するクラス) に設定するだけです。しかし、プロジェクションを使用すると、Bulletin オブジェクトが null になります。

私はまた、使用する別のスレッドを読んでいました

setResultTransformer(Transformers.aliasToBean

しかし、それもうまくいきません。コードをより良くする方法について、誰かがこれを手伝ってくれますか。

ありがとう

ハリッシュ

4

3 に答える 3

8

使用できます

 criteria = this.getSession().createCriteria(Bulletin.class)
            .setProjection(Projections.projectionList()
            .add(Projections.property(bulletinIdAttr),"bulletinIdAttr")
            .add(Projections.property(docNameAttr),"docNameAttr")   
            .add(Projections.property(docTypeCodeAttr),"docTypeCodeAttr")
            );        
criteria.addOrder(Order.desc(createdTimeAttr));
criteria.setResultTransformer(new AliasToBeanResultTransformer(Bulletin.class));
List<Bulletin> bulletinList = criteria.list();

ここで criteria.setResultTransformer(new AliasToBeanResultTransformer(Bulletin.class)) は結果を目的の POJO クラスに変換しますが、POJO クラス (この場合は Bulletin.class) にプロパティの値を設定するための適切なセッターが必要であることを確認してください。

現在、criteria.list() は Object の代わりに Bulletin POJO クラスの List を返します。

于 2014-04-07T12:51:13.750 に答える
5
  1. Projections.property()文字列を引数として取ります。あなたが提供したコードでは、その文字列の値は Bulletin クラスのメンバーの名前でなければなりません。おそらくbulletinIdAttr、たとえば、 はそのような値を持つ文字列です。そうしないと、実行時エラーが発生します。
  2. Criteria インスタンスを呼び出すsetProjectionと、暗黙的に ResultTransformer が設定されPROJECTIONSます。これが目的です。自分に電話する必要はありませんsetResultTransformer。このようにルーチンを少し単純化します

    List<Object[]> rows = criteria.list();
    for (Object[] row : rows) {
       Bulletin bull = new Bulletin();
       bull.setBulletinId((Long) row[0]);
       bull.setDocumentName((String) row[1]);
       bull.setDocumentTypeCode((String) row[2]);
       list.add(bull);
    }
    

しかし、それはあなたの結果に何の違いももたらさないはずです。rows空であることを確認しましたか?

于 2012-06-16T16:56:35.723 に答える
3

同じ条件で 2 回目の検索を行う場合は、射影を変更または削除する必要があります。たとえば、最初にカウントを検索する場合:

criteria.setProjection(Projections.rowCount());
Integer count = criteria.list().get(0);

次に、すべてのオブジェクトをフェッチします。

criteria.setProjection(null);
List<Object> returnedObjects = criteria.list();
于 2016-03-23T16:17:33.973 に答える