【问题标题】:JPA Query Many To One nullable relationshipJPA查询多对一可为空的关系
【发布时间】:2012-08-19 22:51:06
【问题描述】:

我有以下实体,想就如何从关系双方查询选定属性寻求帮助。这是我的模型。假设所有表都在数据库中正确创建。我使用的 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,然后从与 Person 对象相关的 Info 对象中获取名字和姓氏,而后者又与 Book 对象相关。我不想从 Info 对象中获取所有信息,只对选定的信息感兴趣,例如在这种情况下的名字和姓氏。

请注意,Borrower 和 Book 之间的关系标记为 optional=true,这意味着可能有一本书可能还没有被某人借过(显然它有一个作者)。

【问题讨论】:

    标签: jpa jpa-2.0


    【解决方案1】:

    搜索作者“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 休眠

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

    为了方便和可能性,我们建议使用休眠标准。

    问候,

    【讨论】:

      猜你喜欢
      • 2014-04-08
      • 1970-01-01
      • 2015-08-18
      • 1970-01-01
      • 2013-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多