2011-11-23 99 views
3

我正在使用hibernate分离条件从表(Oracle数据库)中获取结果。我需要通过升序某列来获取结果顺序。该列包含数字,但数据类型为varchar。如果我们不为一列应用to_number(),那么Oracle将按照顺序进行ASCII比较。所以,我需要应用to_number()来排序结果,因为列包含所有数字,但数据类型为varchar。请从下面的查询,我使用如何在Hibernate标准中为列应用to_number?

public List<EntityClass> getResults(final String someinput) throws Exception { 
    DetachedCriteria criteria = DetachedCriteria.forClass(EntityClass.class); 
    criteria.add(Restrictions.eq("input", someinput)); 
    criteria.addOrder(Order.asc("someId")); // **here id column is of varchar type**. 

    List<EntityClass> results= this.getHibernateTemplate().findByCriteria(criteria); 
    return results; 
} 

criteria.addOrder(Order.asc("someId")); - 在这里我需要申请to_number。我们可以使用SQL查询轻松实现,但我应该只使用条件查询。
请帮我怎么做到这一点?

回答

2

我知道NHibernate使用Projections.cast可以实现这个功能,但是AFAIK你想要的是用Hibernate这种方式是不可能的。 我看只使用标准的唯一解决办法是使用@Formula(虽然我从来没有做过这个我自己):

@Column 
private String someId; 

@Formula(value="to_number(someId)") 
private Long someIdNumber; 

... 

criteria.addOrder(Order.asc("someIdNumber")); 

个人而言,我会考虑订购在Java中的结果(比较),因为任何解决方案,您选择你的查询将取决于特定的DBMS。

+0

嗨,谢谢你的回复。我不使用注释。我怎样才能在hbm中指定这个?请帮忙.. – user1016403

+0

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-column(我个人建议切换到注释,除非你有很好的理由不)。 –

+0

工作得很好。请注意,公式中指定的“someId”应该是列名称 –