JPA查询多对一可空关系
我有以下实体,希望获得有关如何从关系双方查询所选属性的帮助。这是我的模型。假设所有表都在数据库中正确创建。我使用的JPA提供程序是HibernateJPA查询多对一可空关系,jpa,jpa-2.0,Jpa,Jpa 2.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
@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;
......;
}
如何编写一个JPA查询,让我只选择我想要的属性。我想从Book中获取属性ISBN代码,然后从与Person对象相关的Info对象中获取名字和姓氏,而Person对象又与Book对象相关。我不想从Info对象获取所有信息,只对所选信息感兴趣,例如在本例中的名字和姓氏
请注意,借书人和书籍之间的关系标记为optional=true,这意味着可能有一本书尚未被人借阅(显然它有作者)。通过作者“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();
CriteriaQuery-criteria=builder.createQuery(Book.class);
Root personRoot=criteria.from(Book.class);
谓词=builder.conjunction();
列表表达式=predicate.getExpressions();
Path firtsName=personRoot.get(“作者”).get(“信息”).get(“名字”);
add(builder.equal(firtsName,“Marc”);
标准。其中(谓词);
条件。选择(personRoot);
List books=em.createQuery(criteria).getResultList();
标准JPA Hibernate
List<Book> books = (List<Book>)sess.createCriteria(Book.class).add( Restrictions.eq("author.information.firstName", "Marc") ).list();
List books=(List)sess.createCriteria(Book.class).add(Restrictions.eq(“author.information.firstName”,“Marc”)).List();
为了方便和可能,我们建议使用hibernate标准
问候,
List<Book> books = (List<Book>)sess.createCriteria(Book.class).add( Restrictions.eq("author.information.firstName", "Marc") ).list();