如何在Hibernate中使用@Where

问题描述 投票:0回答:4

搜索了几个小时,但我陷入了 PlayFramework 与 JPA 的学习曲线。我正在建立一个可以发帖的示例网站。但这些帖子可以有这样的状态:

  • PostDraft(帖子为草稿,请勿发布)
  • PostPublished(帖子可以发布)

这些状态存储在单独的表中。显然,草案状态帖子 应该还看不到。

所以我有这些课程:

  • 页面类(从表格中获取页面信息,1页可以有多个帖子)
  • 帖子类(帖子可以是草稿并已发布)

在我的页面类中,我有:

@Column(name="POSTS_REF")
@Where(clause="PostPublished")
private List<Posts> userPosts;

但这不起作用!那么,我如何指定一个 where 子句,只加载处于已发布状态的帖子而不使用 JPQL?

谢谢!

更新:2011-10-11

表:帖子,含列: - ID - 标题 - state_ref(引用States表的ID) - 内容

表:状态,包含列: - ID - 州名

所以我想说的是:

select * 
from posts inner join states on posts.state_ref = states.id
where states.statename = 'PostPublished'

更新2011-10-13

这是我当前的修改,在我的页面类中:但它也不起作用。

/** link to the states */
@JoinColumn(name = "STATES_REF")
@OneToOne
@Where(clause = "states.statename = 'PostPublished'")
public MyState state;

更新2012-02-13 Emt 的回答毕竟对我有用。

hibernate jpa playframework
4个回答
31
投票

尝试类似:

@Column(name="POSTS_REF")
@Where(clause="state='PostPublished'")
private List<Posts> userPosts;

@Column(name="POSTS_REF")
@Where(clause="PostPublished=true")
private List<Posts> userPosts;

取决于您的

Post
实体上的状态字段类型。


8
投票

where 子句必须是一个完整的条件 - 像这样。假设状态是帖子的属性。

@Column(name="POSTS_REF")
@Where(clause="state = 'PostPublished'")
private List<Posts> userPosts;

编辑

基于数据模型 - 以下内容应该有效。我不建议使用它。不要映射帖子集合 - 只需从 POsts 类引用 Page,向 DAO 添加一个方法,以使用 HQL 或条件查询检索页面已发布的帖子。

@Column(name="POSTS_REF")
@Where(clause="exists (select id from states where state_ref = states.id and states.statename = 'PostPublished')")
private List<Posts> userPosts;

1
投票

where
条件必须包含数据库列名称:

@Where(clause="state = 'PostPublished'")

这里

state
列名位于数据库中,而不是在 Hibernate 映射中。


0
投票

这对我有用。这是在 StudentInfo.java 上

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "studentInfo")
@Where(clause = "active_ind = 'Y'")
private Set<Courses> courses = new HashSet<>();

“active_ind”是课程表中的列,它不是 Course.java 类中的属性名称。表格是 学生信息:

  • 学生id
  • 学生姓名
  • 等等..

课程:

  • 课程_id
  • 课程名称
  • student_id(外键)
  • active_ind
  • 等等..
© www.soinside.com 2019 - 2024. All rights reserved.