JPQL решение проблем узлов коллекции для сравнения в запросе - PullRequest
0 голосов
/ 03 марта 2012

У меня есть объект book, для которого отношение OneToMany настроено на объект Document.Другими словами, в Hibernate объект моей книги возвращает список документов в качестве свойства docs.

Я хочу вернуть список документов для пользователя, который еще не был назначен книге.Вот мой запрос jpql, и я определил его всеми возможными способами, и я не могу заставить его работать:

select d from Document d WHERE d.user = :user
AND NOT EXISTS( SELECT b.docs from Book b WHERE b.docs = d )

Где Book - сущность, Пользователь - сущность, переданная, b.docs - это список документов, а Document (d) - это сущность.

Что я делаю не так?В этой конкретной версии запроса я получаю сообщение об ошибке:

org.hibernate.TypeMismatchException: левая и правая части двоичного логического оператора были несовместимы [java.util.Collection (com.fallenjusticestudios.bardwalk.model.Book.docs): com.fallenjusticestudios.bardwalk.model.Document]

Книга:

@Entity
@Table(name="book")
public class Book {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    @Column
    @NotEmpty
    @NotNull
    private String title;

    @Column
    @NotEmpty
    @NotNull
    private String description;

    @ManyToOne(cascade=CascadeType.MERGE, targetEntity=User.class)
    @JoinColumn(name="user")
    private User user;

    @OneToMany(cascade=CascadeType.MERGE, fetch=FetchType.LAZY, targetEntity=Document.class)
    @JoinColumn(name="document_id",referencedColumnName="id")
    private List<Document> docs;


    // Will need to add Contest to the fields later on.
    //
    //


    public Long getId() {
        return id;
    }

    public String getTitle() {
        return title;
    }

    public String getDescription() {
        return description;
    }

    public User getUser() {
        return user;
    }

    public List<Document> getDocs() {
        return docs;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public void setDocs(List<Document> docs) {
        this.docs = docs;
    }





}

ОБНОВЛЕНИЕ:

Еще одна попытка:

Запрос:

select d from Document d WHERE d.user = :user
AND NOT EXISTS( SELECT Document from Book.docs b WHERE b.id = dn.id )

org.hibernate.hql.ast.QuerySyntaxException: Book.docs не отображается [выберите d из com.fallenjusticestudios.bardwalk.model.Document d WHERE d.user =: пользователь И НЕ СУЩЕСТВУЕТ (ВЫБЕРИТЕ Документ из Book.docs b WHERE b.id = dn.id)] * ​​1025 *

ОБНОВЛЕНИЕ2:

Я понялэто изЯ собирался по поводу запроса все неправильно.Запрос на решение был:

select d from Document d WHERE d.user = :user
AND NOT d IN( SELECT d from Book b, IN(b.docs) bd WHERE bd.id = d.id )

1 Ответ

0 голосов
/ 03 марта 2012

Я понял это. Я собирался по поводу запроса все неправильно. Запрос на решение был:

select d from Document d WHERE d.user = :user
AND NOT d IN( SELECT d from Book b, IN(b.docs) bd WHERE bd.id = d.id )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...