2015-04-07 103 views
0

我有一个OneToMany从电影到所有语言版本实体 我想也有一个manyToOne朝着原始版本。 该版本包含一个布尔值orginal = true,以将版本限制为唯一具有属性original = true的版本。 所以我尝试一个Forumla限制版本: @JoinFormula(值= “(SELECT v.id FROM persistence.model.Version v,其中v.film.id = ID和v.original为true) 但是生成时在SQL,休眠前缀与film0_真正所以它不工作(在SQL你fiml0_.true) 这里是代码:@JoinFormula为什么hibernate前缀布尔值?

@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的前缀“真”字,其电影别名(film0_)生成SQL时,为什么? 我怎么能摆脱那个?

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,在这种情况下,真是一个文字?

+1

无关,但为什么将它映射为ManyToOne?原始版本是唯一一部电影的原始版本,不是吗?你试过'='真'吗?它似乎与PostgreSQL一起工作良好,我猜Hibernate不会在表名中加一个文字字符串。 –

回答

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 =“ID”意味着在公式SQL语句的中间的“id”来源于从膜表id列因此它将由Hibernate与前缀当生成完整的SQL时,正确的别名(在我的情况下是film0_)

+0

你能解释一下'select v.id'如何与'originalVersion','Version'类型一起使用?一个'id'怎么可以投射到一个物体上?不应该是'select v'? – Blauhirn