我有以下实体,并希望寻求有关如何从关系两侧查询所选属性的帮助。这是我的模特。假设在db中正确创建了所有表。我正在使用的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表与Person的多对一关系是不可为空的,而Person是可空的。
我要求以表格格式显示以下内容 -
ISBNCode - First Name - Last Name - Person Type
如何编写一个JPA查询,允许我只选择我想要的属性。我想从Book获取属性ISBN Code,然后从Info对象中获取与Person对象相关的名字和姓氏,而Person对象又与Book对象相关。我不想从Info对象获取所有信息,只对选择的信息感兴趣,例如在这种情况下的名字和姓氏。
请注意借款人和图书之间的关系标有optional = true,这意味着可能还有一本书可能尚未被某人借用(显然它有作者)。
答案 0 :(得分: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();
为方便起见,我们建议使用hibernate标准。
此致