Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA查询多对一可空关系_Jpa_Jpa 2.0 - Fatal编程技术网

JPA查询多对一可空关系

JPA查询多对一可空关系,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

我有以下实体,希望获得有关如何从关系双方查询所选属性的帮助。这是我的模型。假设所有表都在数据库中正确创建。我使用的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;
......;

}
如何编写一个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();