【问题标题】:Issues with bidirectional OneToMany mapping and NamedQuery双向 OneToMany 映射和 NamedQuery 的问题
【发布时间】:2015-03-10 11:23:19
【问题描述】:

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

地点:

@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。

【问题讨论】:

  • @Ankit 我想要一个在特定日期投票的地点列表,如果没有投票,则应跳过该地点。

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


【解决方案1】:

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

 Select DISTINCT LocationID FROM VOTE WHERE DATE == dateCreated;

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

【讨论】:

  • 这将为他提供整个位置对象,并附上所有选票,但他希望按日期过滤选票。
  • 那么他不能在单个查询中做到这一点。
【解决方案2】:

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

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

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

【讨论】:

  • 使用 Criteria API 也不可能吗?
  • 我认为不可能,请阅读thisthis。我将引用第二个链接中的相关句子:This query says that for each Magazine x, traverse the articles relation and check each Article y, and pass the filter if y's authorName field is equal to "John Doe". In short, this query will return all magazines that have any articles written by John Doe.
  • 所以唯一的方法是查询所有带有位置的选票并将它们存储为对我有帮助的格式?
  • 是的,类似的。
猜你喜欢
  • 2020-06-26
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
相关资源
最近更新 更多