如何在JPA中表达此ORDER BY子句?

时间:2013-08-27 14:33:06

标签: mysql hibernate jpa sql-order-by jpa-2.0

我正在使用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转换(REPLACE(user_name,?,''),签名)”作为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'”,但不起作用。

2 个答案:

答案 0 :(得分:0)

这将是丑陋的,但你应该能够使用CriteriaBuilder&#39; function()&#39;方法

答案 1 :(得分:0)

使用replaceFn.as(Integer.class)代替builder.function("CONVERT", String.class, replaceFn, signedExpr)将问题中最后一个代码块的代码更改为:

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<Integer> convertedExpr = replaceFn.as(Integer.class);
criteria.orderBy(builder.desc(convertedExpr));

修改 这可能不起作用,因为Javadoc表示“运行时类型未更改”。