【问题标题】:How to use @Where in Hibernate如何在 Hibernate 中使用 @Where
【发布时间】:2011-12-03 17:52:50
【问题描述】:

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

  • 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


    【解决方案1】:

    尝试类似:

    @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 实体上的状态字段类型。

    【讨论】:

    • 如果在@Where(clause="PostPublished=true") 中,我想从模型的属性中获取值而不是硬编码值怎么办?
    【解决方案2】:

    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;
    

    【讨论】:

    • 您好 gkamal,感谢您的回答,但这对我不起作用。我将使用数据模型更新我的问题。
    • 嗨 gkamal,我不能使用这个,因为我有一个状态表,所有状态都在这个表中。人的状态和 cmets 的状态也是如此...... :-(
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-18
      • 2018-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多