我有一个Person表,它有两列:first_name和last_name。 Person类有两个相应的字段:firstName和lastName。现在我正在使用条件api并尝试基于连接的这两列创建订单。可能吗?或者它只能通过hql实现?
答案 0 :(得分:25)
以下是JBoss hibernate site的示例:
from DomesticCat cat order by cat.name asc, cat.weight desc, cat.birthdate
或者来自同一网站,Criteria api:
List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "F%")
.addOrder( Order.asc("name") )
.addOrder( Order.desc("age") )
.setMaxResults(50)
.list();
他们似乎非常喜欢JBoss的猫。
答案 1 :(得分:0)
我有同样的问题和标准api orderBy方法不能使用连接列。我需要将它与criteriaBuilder.construct()方法一起使用。我通过扩展Orale10gDialect类并注册自定义函数来解决这个问题:
import org.hibernate.dialect.Oracle10gDialect;
import org.hibernate.dialect.function.SQLFunctionTemplate;
import org.hibernate.type.StandardBasicTypes;
public class CustomOracle10gDialect extends Oracle10gDialect {
public CustomOracle10gDialect() {
super();
// This must be used due to bug in Hibernate (orderBy won't work with concat)
registerFunction("concatwithspace", new SQLFunctionTemplate(StandardBasicTypes.STRING, "?1 || ' ' || ?2"));
}
}
然后:
Expression<String> user = cb.function("concatwithspace", String.class, criteriaRoot.get("firstname"), criteriaRoot.get("lastname"));
...
criteriaQuery.orderBy(cb.asc(user));
当然,您还必须选择此连锁列。