2012-08-24 4 views
0

나는 다음과 같은 요소를 가지고 관계의 두 측면에서 선택한 속성에 대한 조회하는 방법에 대한 도움을 요청하고 싶습니다. 여기 내 모델입니다. 모든 테이블이 제대로 DB에 생성됩니다 가정합니다. 내가 사용하고 JPA 공급자가 최대 절전 모드입니다.한 널 (NULL) 관계로 많은 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; 
......; 

} 

당신이 볼 수 있듯이,이 책 테이블은 Null을 허용 한 널 (NULL)없는 사람의 관계와 사람에 대한 많은있다. 나는이 날은 내가 원하는 것이 속성을 선택할 수 있도록하는 JPA 쿼리를 쓸 수있는 방법

ISBNCode - First Name - Last Name - Person Type 

-

은 내가 표 형식으로 다음, 보여줄 수있는 요구 사항을 가지고있다. 나는 책에서 속성 ISBN 코드를 얻으려면, 다음 제 차례로 도서 객체에 관련되는 사람 개체와 관련된 정보 객체에서 성과 이름 것입니다. 나는 정보 객체,이 경우 예 : 이름과 성 관심 선택된 정보에서 모든 정보를 얻을 싶지 않을 것이다.

차용자와 책의 관계에는 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(); 

우리는 편리함과 가능성에 대한 최대 절전 모드 CRITERIAS를 사용하는 것이 좋습니다.

감사합니다.