JPA Как создать запрос с отношениями ManytoOne? - PullRequest
2 голосов
/ 22 января 2011

Основной вопрос:
Если у меня есть сущность B с полем ManyToOne x, связанная с другой сущностью A, как мне получить все экземпляры B, которые имеют A в своем поле x?


Более конкретно:
Рассмотрим следующие аспекты:

public class User {
 @Id
 @GeneratedValue(strategy = GenerationType.IDENTITY)
 @Column(name = "USER_ID")
 private Key id;
@OneToMany(mappedBy = "owner", cascade = CascadeType.ALL)
 private List<Message> messages;
}

ic class Message {
 @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column (name="MESSAGE_ID")
    private Key id;
    @ManyToOne(fetch = FetchType.LAZY)
    private User owner;
    private int status;
}

Я уже подготовил этот запрос

Query query = em.createQuery("SELECT m from Message m WHERE m.owner = :us");

Вот API для метода, который я хочу построить:
Ввод: Пользователь u, Состояние s
Вывод: Список всех сообщений с владельцем u и статусом s.

Я знаю, что должен создать запрос, используя EntityMenager, но каков правильный синтаксис? Что я помещаю в часть (* "ВЫБЕРИТЕ m ИЗ сообщения m, ГДЕ владелец = _ AND status =" + status *).

когда я попробовал это:

Query query = em.createQuery("SELECT m from Message m "
+"WHERE m.owner.id = :ownerId");

Я получил следующую ошибку:

javax.persistence.PersistenceException: 
SELECT FROM Message m WHERE m.owner.username = :ownerID: 
Can only reference properties of a sub-object if the sub-object is embedded.

Заранее спасибо ....

1 Ответ

5 голосов
/ 22 января 2011

Вы можете выполнить запрос к полям объекта, используя '.' нотации. Например, вы можете получить сообщения с конкретным владельцем, запросив «m.owner.id =?», Или сообщения с владельцем в определенном состоянии, запросив «m.owner.address.state.id =?»

Query q = em.createQuery(" FROM package.Message m WHERE m.owner.id = :ownerId AND m.status = :status")
            .setParameter("ownerId", user.id)
            .setParameter("status", status)
            .getResultList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...