2011-01-20 1 views
0

У меня есть две сущности:Список элементов в продаже с использованием JPA

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

Использование JPA, я хотел бы перечислить все предметы, которые были куплены более чем Х раз, упорядоченные по их закупленных раз (первый будучи самым покупаемым).

мне удалось запрос правильный 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 
    } 
} 

Но это (на самом деле) возможно, что мои методы не хорошо. И так как вы поднимаете критерии, возможно, мне стоит взглянуть на это, даже для «setPriceMin» и всех других методов.

Как вы поживаете?

+0

Пожалуйста, покажите, что вы хотите в SQL. – Daniel

+1

Почему бы вам избежать createQuery()? Запрос JPA - это путь сюда, либо через API критериев (если вы используете JPA2), либо прямым запросом JPA (именованный запрос). Действительно ли вы храните item_id в своей организации «Покупки»? Путь JPA должен состоять в том, чтобы иметь ссылку на элемент и позволить JPA обрабатывать идентификационные данные. – bert

+0

Я добавил более подробную информацию :) –

ответ

0

Вы не можете сделать это без запроса.

Либо переписывать запрос как JPQL (очень похоже, но вам придется заменять идентификаторы объектами и делать соединения по свойствам, а не на таблицах) или использовать JPA 2 CriteriaQuery API. (Или используйте свой SQL как собственный запрос, но обычно это плохая идея)

+0

Я добавил более подробную информацию, может быть, это поможет вам? –

Смежные вопросы