我有两个实体:
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”和所有其他方法。
你好吗?
答案 0 :(得分:0)
如果没有查询,则无法执行此操作。
将Query重写为JPQL(非常相似,但您必须将id替换为对象并对属性进行连接,而不是对表进行连接),或使用JPA 2 CriteriaQuery
API。 (或者将您的SQL用作本机查询,但这通常是一个坏主意)