Hibernate选择一对多的帮助

时间:2011-03-23 08:02:18

标签: java hibernate jpa hql

我将以下类映射为一对多:当一个读者可以容纳多本书时读者和书籍:

图书:

@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.
}

阅读器

@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;
    }
}

现在我想使用一些book id来获取reader类,例如:

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 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:-2)

我认为你应该创建一个表来将读者映射到书中。 它使事情变得更容易。

相关问题