1

私のHQLコード:

select count(products.id) ,products.id, products.productDescription, p.products.productFileName
    from Polls as p
    group by products.id
    order by count(products.id) desc

このクエリは

Coloumn 1 | Column 2 | Column 3 | Column 4
3         | 2        | Product1 | ProductFilename1
2         | 1        | Product2 | ProductFilename2

それらをリストに入れて、jspページに表示したいと思います。

私の質問は次のとおりです。このクエリのカウントのためにフィールドをマップできるように、新しいクラスを作成する必要がありますか?何か助けてください?

私のクラスは次のとおりです。

public class Polls  implements java.io.Serializable {

    private Integer id;
    private Products products;
    private Users users;
    private Date voteDate;

    public Polls() {
    }

    public Polls(Products products, Users users, Date voteDate) {
       this.products = products;
       this.users = users;
       this.voteDate = voteDate;
    }

    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
    public Products getProducts() {
        return this.products;
    }

    public void setProducts(Products products) {
        this.products = products;
    }
    public Users getUsers() {
        return this.users;
    }

    public void setUsers(Users users) {
        this.users = users;
    }
    public Date getVoteDate() {
        return this.voteDate;
    }

    public void setVoteDate(Date voteDate) {
        this.voteDate = voteDate;
    }
}

製品クラス:

public class Products  implements java.io.Serializable {


    private Integer id;
    private String productDescription;
    private String productFileName;
    private Set pollses = new HashSet(0);

    public Products() {
    }


    public Products(String productDescription) {
        this.productDescription = productDescription;
    }

    public Products(String productDescription, String productFileName, Set pollses) {
       this.productDescription = productDescription;
       this.productFileName = productFileName;
       this.pollses = pollses;
    }

    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
    public String getProductDescription() {
        return this.productDescription;
    }

    public void setProductDescription(String productDescription) {
        this.productDescription = productDescription;
    }
    public String getProductFileName() {
        return this.productFileName;
    }

    public void setProductFileName(String productFileName) {
        this.productFileName = productFileName;
    }
    public Set getPollses() {
        return this.pollses;
    }

    public void setPollses(Set pollses) {
        this.pollses = pollses;
    }
}

私は次のように拡張されたforループでリストを表示しようとしています:

<%
List<Object[]> myGadgets = new GadgetsRepository().getGadgetDescVotes();
for (Object p : myGadgets) {%>
    <div class="gadgetItem">
        <div><%=p[0]%>&nbsp;</div>//this don't work
    </div>
<%  }%>
4

3 に答える 3

2

必ずしもそうとは限りませんが、新しいオブジェクトを作成すると、よりクリーンで操作が少し簡単になります。あなたがそれをラップしない限り、あなたが持っているクエリはを返すはずList<Object[]>です。したがって、テーブルをレンダリングするには、そのコレクションを反復処理するだけです。ただし、基になるタイプとして特定のアイテムを操作する必要がある場合は、それをキャストする必要があります。

使用しているフレームワークはわかりませんが、このようなものは純粋なjspで機能します。

<c:forEach value="${collection}" var="item">
  <c:out value="${item[0]}" />
</c:forEach>

拡張されたforループを使用すると、次のようなことができます。

for(Object[] c : resultSet) {
   //work with c[0], c[1], etc...
}

ラッパーオブジェクトを作成する場合は、表示されている内容を文書化するフィールド名を使用できるという利点があります。また、基になるフィールドのタイプ情報も使用できます(からキャストする必要はありませんObject)。

于 2013-01-16T18:03:58.513 に答える
1
  1. 何もする必要はありません。クエリは、バニラJSPで表示できる配列のリストを返します。唯一の欠点は、名前(row [0]、row [1]など)ではなくインデックスでフィールドにアクセスする必要があることです。

  2. 新しいオブジェクトをクエリ結果にマッピングすると、Hibernateの主な誤用となり、後で逆効果になる可能性があります(同じ行を別のオブジェクトで変更できる場合)。

  3. 常にORMマッパーを使用することを余儀なくされていると感じないでください。証拠は、プレーンSQLクエリが必要であることを示唆しています。あなたの例では、実際にはオブジェクトを操作しておらず、リレーショナルデータをレポートにクエリしています。Connectionオブジェクトを取得し(doWorkメソッドを使用し、Workオブジェクト内から接続を使用するのが最適です)、通常のクエリを実行します。

  4. SQLが本当に嫌いな場合は、必要なすべての列と関連するゲッターを取得するコンストラクターを使用して、単純なオブジェクト(不変である可能性があります)を作成します。オブジェクトをマップせず、代わりにHQLを次のように変更します。


     select new MyAggregatedPollRow(count(products.id) ,products.id, products.productDescription, p.products.productFileName) from Polls as p
       group by products.id
       order by count(products.id) desc

于 2013-01-16T18:26:09.893 に答える
0

Hibernateを使用すると、テーブルのメソッドを簡単に作成できることを利用できます。

あなたはできる:

HQLを3つのメソッドに分割し、各メソッドにクエリを実行して、関心のあるテーブルの数を取得します。

ジェネリックオブジェクトを取得してエンティティのカウントを取得し、適切と思われるエンティティに再利用する単一のメソッドを作成します。

于 2013-01-16T18:37:48.333 に答える