1

ばかげた質問でごめんなさい。製品と注文のテーブル(多対多の関係)があり、ユーザーテーブルもあります。そして今、user_idと特別なフィールド「order_satus」によって製品数を取得したいと思います。2つのクエリで特別な基準で注文を取得し、次に商品のサイズを順番に取得することができます。しかし、これはまったく最適ではありません。JDBCTemplateを使用すると、多くの結合を実行し、クエリを1つだけ取得します。

これが私のエンティティです:

@Entity
@Table(name = "shop.order")
public class Order {
@Id
@Column(name = "order_id")
@GeneratedValue(strategy = GenerationType.AUTO)
private long orderId;

private long user_id;

@Column(name = "databegin")
private Date dateBegin;

@Column(name = "dataend")
private Date dateEnd;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", insertable = false, updatable = false)
private User user;

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "order_product", joinColumns = { @JoinColumn(name = "order_id") }, inverseJoinColumns = { @JoinColumn(name = "product_id") })
private List<Product> products;
}

製品エンティティ

 @Entity
    @Table(name = "product")
    public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int product_id;


    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "order_product", joinColumns = { @JoinColumn(name = "product_id") }, inverseJoinColumns = { @JoinColumn(name = "order_id") })
    private List<Order> order;

    public List<Order> getOrder() {
        return order;
    }

    public void setOrder(List<Order> order) {
        this.order = order;
    }

    @Column
    @NotBlank
    private String name;

    @Column
    @Max(value = 250)
    private String descr;

    @Column
    @Max(value = 250)
    private String manufacturer;

    @Column
    private Double price;

    @Column
    private Byte[] barcode;

    @Column
    private Byte[] picture;

    @ForeignKey(name = "category_id")
    private int category_id;
4

3 に答える 3

2

あなたがSQLクエリを与えたように。

'ord.id =のprodutcp結合順序ordからcount(*)を選択します。およびord.status=? ' –イゴールマスターノイ

そして、あなたが与えたエンティティ構造によれば、HQLは次のようになります。

select ord.products productList from Order ord where ord.id=? and ord.status=?

このクエリは製品のリスト(List<Product> products)を返し、Javaコードでカウントを取得できます。つまりproductList.size();、このサイズは、パラメータとして渡す注文IDと注文ステータスに基づいて必要な製品カウントですuser.id。ユーザーごとに結果をフィルタリングします。

これは、必要に応じてproductListです。

Query query = getSession().createQuery("select ord.products productList from Order ord where ord.id=:orderID and ord.status=:orderStatus");
query.setInteger("orderID", orderIDParameter);
query.setString("orderStatus", orderStatusParameter);
List<Product> productList = (List<Product>) query.list();
Integer productCount = productList.size();

このproductCountは、必要な製品数です。

于 2012-06-06T12:25:48.357 に答える
0

私が正しく理解すれば、1人のユーザーに対して多くの注文を行うことができ、1回の注文に対して多くの製品を注文することができます。

DetachedCriteriaを使用し、それを使用してクエリを作成するのが良いオプションだと思います。

次のようになります(テストされていません):

DetachedCriteria userCriteria = DetachedCriteria.forClass(User.class);
userCriteria.add(Projections.groupProperty("user_id"));
userCriteria.add(Projections.count("product_id");
DetachedCriteria orderCriteria = userCriteria.createCriteria("order.user_id","order",CriteriaSpecification.LEFT_JOIN);
DetachedCriteria orderCriteria = orderCriteria.createCriteria("order_product.order_id","product",CriteriaSpecification.LEFT_JOIN);
//orderCriteria.add(Restrictions.eq(...); // I can't see a "status" field in your model

List results = userCriteria.list();
于 2012-06-06T12:27:22.740 に答える
0
select size(ord.products) from Order ord where ord.id = :orderId and ord.status = :orderStatus

また

select count(*) from Order ord join ord.products where ord.id = :orderId and ord.status = :orderStatus

最初の形式は、カウントを取得するためのサブクエリになります。2つ目は、結合に依存して、カウントを適用するSQL製品を作成します。私の意見では、最初の形式の方が直感的ですが、ほとんどの場合、2番目の形式の方がパフォーマンスが高くなります。

于 2012-06-06T13:27:42.960 に答える