Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 我如何在JPA中用条款表达这个订单?_Mysql_Hibernate_Jpa_Sql Order By_Jpa 2.0 - Fatal编程技术网

Mysql 我如何在JPA中用条款表达这个订单?

Mysql 我如何在JPA中用条款表达这个订单?,mysql,hibernate,jpa,sql-order-by,jpa-2.0,Mysql,Hibernate,Jpa,Sql Order By,Jpa 2.0,我正在使用JPA2.0、Hibernate4.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, ?, ''), s

我正在使用JPA2.0、Hibernate4.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);
除了我的从句中的“订货人”部分,我能算出每一部分。这是不带ORDERBY子句的已转换查询

    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);
final CriteriaBuilder=m_entityManager.getCriteriaBuilder();
最终准则查询准则=builder.createQuery(User.class);
最终根用户=criteria.from(user.class);
其中(builder.like(user.get(user.userName),userName+“%”);
final TypedQuery query=m_entityManager.createQuery(条件);
你知道我是如何把“订单转换(替换(用户名),签名)”写成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));
最终表达式usernamePrefixExpr=builder.literal(userNamePrefix);
最终表达式emptyStrExpr=builder.literal(“”);
最终表达式replaceFn=builder.function(“REPLACE”,String.class,user.get(user\ux.userName),usernamePrefixExpr,emptyStrExpr);
最终表达式signedExpr=builder.literal(“signed”);
最终表达式convertExpr=builder.function(“CONVERT”,String.class,replaceFn,signedExpr);
orderBy(builder.desc(convertExpr));

但是“signed”被替换为“signed”,这不起作用。

这会很难看,但是你应该可以用CriteriaBuilder的function()方法来实现。

使用
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));
最终表达式usernamePrefixExpr=builder.literal(userNamePrefix);
最终表达式emptyStrExpr=builder.literal(“”);
最终表达式replaceFn=builder.function(“REPLACE”,String.class,user.get(user\ux.userName),usernamePrefixExpr,emptyStrExpr);
最终表达式convertedExpr=replaceFn.as(Integer.class);
orderBy(builder.desc(convertedExpr));
编辑
这可能不起作用,因为状态为“运行时类型未更改”。

我尝试了“函数”,但似乎无法准确翻译“已签名”我认为
函数
方法的问题在于,它假设所有函数参数都是最终计算为int或string或类似值的表达式,而不是关键字。另一种非常丑陋的方法可能是将强制转换封装到mysql函数e中。G命名castStringToInt,然后通过JPA
函数调用它。但是除了增加对存储函数的依赖之外,如果结果集很大,这可能会对性能产生不良影响。这个“castStringToInt”函数是我要编写的还是MySQL中内置的一些东西我可以使用?我不想写任何自定义的MySQL代码,但如果这是这里唯一的解决方案,那就这样吧。嗨,我不明白你的意思。Java代码将变成什么?感谢您的澄清。运行此命令时,我会得到Hibernate运行时异常,“java.lang.IllegalArgumentException:org.Hibernate.QueryException:cast()需要两个参数[从org.mainco.subco.user.domain.user中选择GenerateDias0作为GenerateDias0,其中(GenerateDias0.userName类似:param0)和(GenerateDias0.url=:param1)按cast排序(替换(generatedAlias0.userName,:param2,:param3)作为整数)desc]”。为什么不继续使用本机查询?我认为如果使用特定于mysql的函数,不使用本机查询没有任何好处(我认为本机查询支持就是为了解决这类问题而实现的)