@JoinFormula为什么hibernate前缀为boolean?

时间:2015-04-07 17:37:57

标签: hibernate jpa

我有一个从电影到其所有语言版本实体的OneToMany 而且我想在原版上也有很多东西。 此版本包含布尔值orginal = true以将版本限制为唯一具有属性original = true的版本。 所以我尝试使用Forumla来限制版本:      @JoinFormula(值=             “(SELECT v.id FROM persistence.model.Version v WHERE v.film.id = id AND v.original is true) 但是当生成SQL时,hibernate前缀为true0,因此它不起作用(在SQL中你得到fiml0_.true)。 这是代码:

@Entity
public class Film implements Serializable {

    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Long id;

    private String title;

    @OneToMany(mappedBy = "film")
    private Set<Version> versions = new HashSet<Version>();

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumnsOrFormulas( @JoinColumnOrFormula(formula = 
        @JoinFormula(value = 
        "(SELECT v.id FROM persistence.model.Version v WHERE  v.film.id = id AND  v.original is true )", 
         referencedColumnName = "id")) })
    private Version originalVersion;

...
}

@Entity
public class Version implements Serializable {

    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Long id;

    private String language;

    private boolean original;

    @ManyToOne
    private Film film;
    ...
}

问题是Hibernate在生成SQL时使用Film别名(film0_)作为“true”文字的前缀,为什么? 我怎么能摆脱那个?

select film0_.id as id1_0_0_,  etc ...
_ from Film film0_ 
left outer join Version version1_ on 
(SELECT v.id FROM persistence.model.Version v 
  WHERE  v.film.id = film0_.id AND  v.original is film0_.true )=version1_.id

当然film0_.true不是一个列,我怎么能告诉Hibernate在这种情况下,true是一个文字?

1 个答案:

答案 0 :(得分:1)

@JBNizet感谢您的评论。 我意识到我做了一个愚蠢的猜测:公式是HQL,但它是普通SQL !考虑到这一点,它更容易使它工作; ) 你是对的Postgres明白布尔的许多语法。

解决方案是:

@JoinColumnsOrFormulas({ 
    @JoinColumnOrFormula(formula = 
        @JoinFormula(value = "(SELECT v.id FROM version v WHERE id = v.film_id AND v.original = 'true' )", 
                    referencedColumnName = "id")) })
private Version originalVersion;

referencedColumnName =&#34; id&#34;意味着&#39; id&#39;在公式的中间,SQl来自FILM表的id列,因此在生成完整的SQL时,Hibernate将使用正确的别名(在我的情况下为film0_)作为前缀