Ebean finder - 选择被忽略

时间:2014-09-14 17:19:16

标签: playframework-2.0 ebean

我正在开发一个播放框架应用程序,其中包含ebean。所以我决定尝试一下。我有一个模型,我使用@Formula注释来获取一个总和,如下所示:

@Entity
public class Note extends Model {

    private static final long serialVersionUID = -2384288983980432586L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(insertable = false, updatable = false)
    private Long id;
    @Transient  
    @Formula(select = "case a.upvotes when null then 0 else a.upvotes end case", join = "left outer join (select v.note_id, count(*) as upvotes from notevote v where v.noteval > 0 group by v.note_id) as a on a.note_id = ${ta}.id")
    private Integer upvotes;
    ....

此查询编译并且一切似乎都有效,除了upvotes字段始终为空的事实。所以每当我使用ebean.finder查询某些内容时,我都会读到这个字段。所以要通过id,我需要写:

Ebean.find(Note.class).select("id, upvotes").setId(id).findUnique();

而不是

Ebean.find(Note.class).setId(id).findUnique();

问题是我在上面的选择部分写的并不重要,它会被忽略。

2 个答案:

答案 0 :(得分:2)

在进行任何更复杂的调试之前,请尝试通过upvotes字段删除@Transient注释。

来自javadocs

  

您也可以使用Transient注释和公式   注解。在这种情况下,瞬态注释的效果是   默认情况下,公式不会包含在查询中

这样你就不需要在select中明确提及它了。

如果没有帮助,请按照here所述启用EBean SQL日志,并查看您的公式SQL是否已执行。

知道这一点,我们会考虑下一步该做什么。

答案 1 :(得分:1)

我找到了一个ebean文档文件,其中有一个演示如何使用更简单的查询完成此操作:

@Formula(select = "(select count(*) from Notevote v where v.noteval > 0 AND v.note_id = ${ta}.id)")

使用此语法,删除瞬态注释可以解决问题。当我删除瞬态注释时,每当我读取实体时,我都不必请求该字段......