我正在开发一个播放框架应用程序,其中包含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();
问题是我在上面的选择部分写的并不重要,它会被忽略。
答案 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)")
使用此语法,删除瞬态注释可以解决问题。当我删除瞬态注释时,每当我读取实体时,我都不必请求该字段......