使用JPA列出每个销售的商品

时间:2011-01-20 08:30:08

标签: java sql jpa

我有两个实体:

Items(id, user_id, title, price);
Purchases(id, item_id, user_id, date);

使用JPA,我想列出购买时间超过X次的所有商品,按购买时间排序(第一次购买最多)。

我设法获得了正确的SQL请求,但是如何在JPA中执行此操作(可能不使用createQuery或类似的东西):

SELECT i.title, COUNT(p.id) as rank FROM items AS i LEFT OUTER JOIN purchases AS p ON p.item_id = i.id WHERE rank > X GROUP BY i.title ORDER BY rank DESC;
// of course, X is an int!

感谢您的帮助! :)

更新: 我表示要避免使用createQuery,但我没有解释原因。 问题是,我创建了一个专门用于生成查询的类,它看起来像:

public class Arguments {
    protected HashSet allowedOrders = new HashSet();
    protected Collection args = new ArrayList();

    // constructor and some other methods

    // this one works great
    public void setPriceMin(int price) {
        query += " AND price > ?";
        args.put(price);
    }

    // sames method for setPrice (= ?), and setPriceMax (= <)

    // this one doesn't :/
    public void setSalesMin(int sales) {
        // here's my problem
    }
}

但是(我的方法)不太可能。既然你提出了Criteria,也许我应该看看它,即使对于“setPriceMin”和所有其他方法。

你好吗?

1 个答案:

答案 0 :(得分:0)

如果没有查询,则无法执行此操作。

将Query重写为JPQL(非常相似,但您必须将id替换为对象并对属性进行连接,而不是对表进行连接),或使用JPA 2 CriteriaQuery API。 (或者将您的SQL用作本机查询,但这通常是一个坏主意)