问题 如何在Hibernate中使用@Where


搜索了几个小时,但我陷入了PlayAramework与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的答案对我有用。


12958
2017-10-08 22:04


起源



答案:


尝试以下方法:

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


11
2017-10-09 05:52





where子句必须是完整的条件 - 就像这样。假设该州是该职位的财产。

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

编辑

基于数据模型 - 以下内容应该有效。我不建议使用它。不要映射posts集合 - 只需从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;

2
2017-10-09 05:47



嗨gkamal,谢谢回答,但这不适合我。我将使用数据模型更新我的问题。 - adis
嗨,根据您的输入更新,这应该工作。 - gkamal
嗨gkamal,我不能使用这个,因为我有一个状态表,所有的状态都在这个表中。所以人的状态,评论状态等...... :-( - adis


答案:


尝试以下方法:

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


11
2017-10-09 05:52





where子句必须是完整的条件 - 就像这样。假设该州是该职位的财产。

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

编辑

基于数据模型 - 以下内容应该有效。我不建议使用它。不要映射posts集合 - 只需从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;

2
2017-10-09 05:47



嗨gkamal,谢谢回答,但这不适合我。我将使用数据模型更新我的问题。 - adis
嗨,根据您的输入更新,这应该工作。 - gkamal
嗨gkamal,我不能使用这个,因为我有一个状态表,所有的状态都在这个表中。所以人的状态,评论状态等...... :-( - adis


where condition必须包含数据库列名:

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

在这里 state 列名在DB中,而不在Hibernate映射中。


0
2018-03-17 11:27