web-dev-qa-db-ja.com

ハイバネート基準:2つの列を連結して並べ替える方法は?

First_nameとlast_nameの2つの列を持つPersonテーブルがあります。 Personクラスには、firstNameとlastNameの2つの対応するフィールドがあります。現在、条件APIを使用しており、これらの2つの列を連結して注文を作成しようとしています。出来ますか?またはそれはhqlによってのみ達成できますか?

18
Georgie Porgie

JBoss hibernate site の例:

from DomesticCat cat order by cat.name asc, cat.weight desc, cat.birthdate

または、同じWebサイトから 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で猫を非常に好むようです。

26
toto2

同じ問題があり、条件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));

もちろん、この連結された列も選択する必要があります。

0
KamilJ