1

对于我可能愚蠢的问题,我很抱歉。我有产品和订单表(具有多对多关系),还有一个用户表。现在我想通过 user_id 和特殊字段“order_satus”获取产品数量。我可以进行两个查询,按特殊标准获取订单,然后按顺序获取产品尺寸。但这根本不是最优的。当我使用 JDBCTemplate 时,我做了很多连接并且只得到一个查询。

这是我的实体:

@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查询..

'select count(*) from produtc p join order ord on ord.id = ? 和 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在 where 中附加原因根据用户过滤您的结果。

这是根据您的需要的产品列表..

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

如果我没记错的话,一个用户可以有多个订单,一个订单可以有多个产品。

我认为一个不错的选择是使用 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

第一种形式将产生一个子查询来获取计数。第二个依赖于连接来创建应用计数的 sql 产品。在我看来,第一种形式更直观,而第二种查询在大多数情况下会表现得更好。

于 2012-06-06T13:27:42.960 回答