双向OneToMany映射和NamedQuery的问题

时间:2015-01-12 16:16:18

标签: jpa jpql criteria-api java-ee-7 named-query

我有两个双向连接的实体,我想查询位置及其对特定日期的投票。

位置:

@Entity
@Table(name = "TAB_LOCATION")
@NamedQueries({
    @NamedQuery(name = "Location.getVotedLocations", query = "SELECT l FROM Location l JOIN l.votes v WHERE v.location = l AND DATE(v.createdAt) = DATE(:date) ORDER BY l.name")
})
public class Location extends AbstractEntity {

  @Basic
  @Size(min = 5, max = 50)
  private String name;

  @Basic
  @Size(min = 0, max = 50)
  private String address;

  @OneToMany(mappedBy = "location")
  private Set<Vote> votes;

  @Basic
  private String description;

投票:

@Entity
@Table(name = "TAB_VOTE")
public class Vote extends AbstractEntity {

  @Basic
  @ManyToOne
  @NotNull
  private User user;

  @Basic
  @ManyToOne
  @NotNull
  private Location location;

我试图使用命名查询,但似乎无论条件如何,位置始终包含所有投票 是否可以将查询的值映射回对象?

entityManager.createNamedQuery("Location.getVotedLocations").
  setParameter("date", date).getResultList();

出了什么问题? 如果NamedQueries无法使用,我也可以使用Criteria API。

2 个答案:

答案 0 :(得分:2)

这是一个简单的MySql语句,它将返回在特定日期投票的locationIDs而非Location实体。

 Select DISTINCT LocationID FROM VOTE WHERE DATE == dateCreated;

然后,您可以通过Location获取LocationID实体。

答案 1 :(得分:1)

当您从某个查询获得实体时,您将获得整个实体。在JPA中,不可能仅获取由where条件修剪的所有数据的子集。

好吧,如果您使用Hibernate,请查看Hibernate Filters,您可以使用它们获得所需的结果。

请注意您的查询,JOIN l.votes,因此您无需再次加入WHERE v.location = l