Hibernate выберите один ко многим, чтобы помочь - PullRequest
0 голосов
/ 23 марта 2011

У меня есть следующие классы, сопоставленные как один ко многим: Читатель и книга, когда один читатель может содержать более одной книги:

Книга:

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

    private static final long serialVersionUID = 1L;

    private Long id;
    private String author;
    private String title;

    public Book(){}
    public Book(String author,String title){
        this.author = author;
        this.title = title;
    }

    @Id
    @GeneratedValue
    @Column(name = "BOOK_ID")
    public Long getId() {
        return id;
    }

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

    @Column(name = "author")
    public String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }

    @Column(name="title")
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    //equals and hashcode ommited.
}

Reader

@Entity
@Table(name = "reader")
public class Reader implements Serializable{

    private static final long serialVersionUID = 1L;

    private Long id;
    private String firstName;
    private String lastName;
    Set<Book> set = new HashSet<Book>();

    @Transient
    public void loanBook(Book book){
        set.add(book);
    }

    @Id
    @GeneratedValue
    @Column(name = "READER_ID")
    public Long getId() {
        return id;
    }

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

    @Column(name="firstName")
    public String getFirstName() {
        return firstName;
    }


    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }


    @Column(name="lastName")
    public String getLastName() {
        return lastName;
    }


    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    @OneToMany(cascade=CascadeType.ALL,fetch = FetchType.LAZY)
     @JoinColumn(name="READER_ID")
    public Set<Book> getSet() {
        return set;
    }


    public void setSet(Set<Book> set) {
        this.set = set;
    }

    public Reader(){}

    public Reader(String firstName, String lastName){
        this.firstName = firstName;
        this.lastName = lastName;
    }
}

Теперь я хотел бы получить класс читателя, используя, например, идентификатор книги:

Reader reader = service.getReaderbyBook(Long.valueOf(10));

Моя функция выглядит так:

    @Override
    public Reader getReaderbyBook(Long id) {
        Session session = null;
        Reader reader = null;
         session =sessionFactory.openSession();
           org.hibernate.Transaction tr = session.getTransaction();
           tr.begin();
           String hqlSelect = "Select .... where book.id:=id";
           Query query = session.createQuery(hqlSelect);
           query.setLong("id", id);
           reader =  (Reader) query.uniqueResult();
           tr.commit();
           session.flush();
              session.close();
              return reader;
    }

}

Как должен выглядеть мой выбор hql, если я просто хочу выбрать одного читателя, связанного с какой-нибудь книгой?

Ответы [ 2 ]

3 голосов
/ 23 марта 2011

from Reader r join r.set book where book.id = :id.

0 голосов
/ 23 марта 2011

Я думаю, вы должны создать таблицу, чтобы сопоставить читателей с книгами.Это облегчает жизнь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...