0

次のエンティティがあり、関係の両側から選択した属性を照会する方法について助けを求めたいと思います。これが私のモデルです。すべてのテーブルがデータベースに適切に作成されていると仮定します。私が使用している JPA プロバイダーは Hibernate です。

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

}

ご覧のとおり、book テーブルには、null 許容でない Person と null 許容の Person に対する多対 1 の関係があります。

以下を表形式で表示する必要があります-

ISBNCode - First Name - Last Name - Person Type

必要な属性のみを選択できる JPA クエリを作成するにはどうすればよいですか。Book から属性 ISBN Code を取得し、次に Book オブジェクトに関連する Person オブジェクトに関連する Info オブジェクトから姓名を取得したいと考えています。Info オブジェクトからすべての情報を取得したくはありません。この場合は、姓名などの選択された情報のみに関心があります。

Borrower と Book の関係は optional=true でマークされていることに注意してください。これは、まだ誰かに借りられていない可能性のある本がある可能性があることを意味します (明らかに著者がいます)。

4

1 に答える 1

0

著者「Marc」の書籍を検索する例:

基準 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 Hibernate

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

利便性と可能性のために、休止状態の基準を使用することをお勧めします。

よろしく、

于 2012-08-24T12:43:32.387 に答える