我有两个双向连接的实体,我想查询位置及其对特定日期的投票。
位置:
@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。
答案 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
。