2

JPA 2.0、Hibernate 4.1.0.Final、および MySQL 5.5.27 を使用しています。ネイティブ MySQL クエリを CriteriaBuilder クエリに変換しようとしています。

    final Query query = m_entityManager.createNativeQuery(
            "SELECT user_name FROM users WHERE user_name like ? ORDER BY convert(REPLACE(user_name, ?, ''), signed) DESC LIMIT 1")
            .setParameter(1, userNamePrefix.toLowerCase() + "%")
            .setParameter(2, userNamePrefix);

句の「ORDER BY」部分を除くすべての部分を把握できます。これは、ORDER BY 句を使用せずに変換されたクエリです ...

    final CriteriaBuilder builder = m_entityManager.getCriteriaBuilder();
    final CriteriaQuery<User> criteria = builder.createQuery(User.class);
    final Root<User> user = criteria.from(User.class);
    criteria.where(builder.like(user.get(User_.userName), username + "%"));
    final TypedQuery<User> query = m_entityManager.createQuery(criteria);

「ORDER BY convert(REPLACE(user_name, ?, ''), signed)」を JPA として記述する方法はありますか?

編集:以下の「関数」の提案を試みていますが、関数の「署名済み」部分を引用符なしで取得する方法はないようです。私は以下を試しました...

    final Expression<String> usernamePrefixExpr = builder.literal(userNamePrefix);
    final Expression<String> emptyStrExpr = builder.literal("");
    final Expression<String> replaceFn = builder.function("REPLACE", String.class, user.get(User_.userName), usernamePrefixExpr, emptyStrExpr);
    final Expression<String> signedExpr = builder.literal("signed");
    final Expression<String> convertExpr = builder.function("CONVERT", String.class, replaceFn, signedExpr);
    criteria.orderBy(builder.desc(convertExpr));

しかし、「signed」は「'signed'」に置き換えられ、機能しません。

4

2 に答える 2

0

見苦しいですが、CriteriaBuilder の 'function()' メソッドでこれを行うことができるはずです。

于 2013-08-28T01:04:41.287 に答える