2013-08-28 79 views
2

我有一个关于使用@OrderBy注释的hibernate多对多映射的问题。假设我们有表A,B和粘合表A_B。我希望集合A.bs按字段B.date排序。当我运行查询我得到异常的说法:休眠与orderby子句的多对多映射不起作用

org.hibernate.exception.SQLGrammarException: ERROR: column b1_.date does not exist 

的问题是,休眠创建查询时在B表中查找在A_B表中的列,而不是。我一直在网上搜索,遇到同样的问题,但没有得到正确的答案(https://forum.hibernate.org/viewtopic.php?f=1&t=950032&sid=b7e3e9ff23a6da3b5fff2f5336d3bb1b),但同时处理类似问题和答案的问题是说这样的配置没有问题(Hibernate : Sorting ManyToMany mapping)。在@OrderBy子句中,我尝试使用域对象中的字段名称,DB中的列名但无济于事。这个问题有什么进展?任何帮助或提示表示赞赏。谢谢。 :)

这些细节:

@Entity 
@Table(name="A") 
public class A implements java.io.Serializable { 

    private Set<B> bs = new HashSet<B>(0); 

    @ManyToMany(fetch=FetchType.LAZY) 
    @JoinTable(name="A_B", joinColumns = { 
     @JoinColumn(name="a_id", nullable=false, updatable=false) }, inverseJoinColumns = { 
     @JoinColumn(name="b_id", nullable=false, updatable=false) }) 
    @OrderBy(clause = "date desc") 
    public Set<B> getBs() { 
     return this.bs; 
    } 
} 

@Entity 
@Table(name="B") 
public class B implements java.io.Serializable { 

    private Date date; 

    /* setters and getters */ 
} 

我省略ID和其他细节。如果我删除了@OrderBy注释,那么所有的东西都像魅力一样。

更多关于我的getter上的最新资讯:

@Temporal(TemporalType.TIMESTAMP) 
@Column(name="date", nullable=false, length=29) 
public Date getDate() { 
    return this.date; 
} 

回答

1

在代码中的日期不@Column注解。

它不应该是这样的:

@Entity 
@Table(name="B") 
public class B implements java.io.Serializable { 

    @Column(name = "date") 
    private Date date; 

    /* setters and getters */ 
} 

编辑:

我创建相同的映射和发现问题。您正在使用org.hibernate.annotations.OrderBy。有了这个注释,我有完全相同的问题。我也使用javax.persistence.OrderBy,一切正常。

所以尽量映射那样:

@ManyToMany(fetch=FetchType.LAZY) 
@JoinTable(name="A_B", joinColumns = { 
    @JoinColumn(name="a_id", nullable=false, updatable=false) }, inverseJoinColumns = { 
    @JoinColumn(name="b_id", nullable=false, updatable=false) }) 
@javax.persistence.OrderBy("date desc") 
public Set<B> getBs() { 
    return this.bs; 
} 
+0

我在getter方法@Column批注。这是休眠工具如何反向工程从数据库来源: @Temporal(TemporalType.TIMESTAMP) @Column(name = “日期”,可为空=假,长度= 29) 公开日期GETDATE(){ 退货。日期; } – Ondra

+0

我改变了我的答案。现在检查:D – paulek

+0

Thx,它帮助。 :)自己无法弄清楚这种细微差别。 :) – Ondra