我有一个从电影到其所有语言版本实体的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是一个文字?
答案 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_)作为前缀