2012-08-24 152 views
0

我有以下實體,並希望尋求關於如何從關係的兩側查詢選定屬性的幫助。這是我的模型。假設所有表都在數據庫中正確創建。我正在使用的JPA提供程序是Hibernate。JPA查詢多對一可空關係

@Entity 
public class Book{ 

@Id 
private long id; 
@Column(nullable = false) 
private String ISBNCode; 

@ManyToOne(cascade = CascadeType.DETACH, fetch = FetchType.LAZY, optional = false) 
private Person<Author> author; 

@ManyToOne(cascade = CascadeType.DETACH, fetch = FetchType.LAZY, optional = true) 
private Person<Borrower> borrower; 

} 

@Inheritance 
@DiscriminatorColumn(name = "personType") 
public abstract class Person<T>{ 

@Id 
private long id; 

@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
private Info information; 

} 

@Entity 
@DiscriminatorValue(PersonType.Author) 

public class Author extends Person<Author> { 

private long copiesSold; 
} 

@Entity 
@DiscriminatorValue(PersonType.Borrower) 

public class Borrower extends Person<Borrower> { 

..... 
} 

@Entity 

public class Info { 

@Id 
private long id; 
@Column(nullable=false) 
private String firstName; 
@Column(nullable=false) 
private String lastName; 
......; 

} 

正如您所看到的,書籍表格與不可爲空的Person以及可爲空的Person之間存在多對一的關係。

我有一個要求來展示,以表格的形式如下 -

ISBNCode - First Name - Last Name - Person Type 

我如何寫一個JPA的查詢,讓我只選擇屬性,我想。我想從Book中獲取屬性ISBN代碼,然後從Info對象中獲取與Person對象相關的名字,這些對象又與Book對象相關。我不想從Info對象獲取所有信息,只關心選定的信息,例如在這種情況下的名字和姓氏。

請注意,借款人和圖書之間的關係標記爲optional = true,這意味着可能有一本書可能還沒有被某人借過(顯然它有一個作者)。

回答

0

例由作者 「馬克」 搜索圖書:

標準JPA標準

CriteriaQuery<Book> criteria = builder.createQuery(Book.class); 
Root<Book> personRoot = criteria.from(Book.class); 
Predicate predicate = builder.conjunction(); 
List<Expression<Boolean>> expressions = predicate.getExpressions(); 
Path<Object> firtsName = personRoot.get("author").get("information").get("firstName"); 
expressions.add(builder.equal(firtsName, "Marc")); 
criteria.where(predicate); 
criteria.select(personRoot); 
List<Book> books = em.createQuery(criteria).getResultList(); 

標準JPA休眠

List<Book> books = (List<Book>)sess.createCriteria(Book.class).add(Restrictions.eq("author.information.firstName", "Marc")).list(); 

我們建議使用便利性和可能性休眠審覈規定。

Regards,