Querydsl: NumberExpression.random() não está funcionando

Criado em 12 mai. 2016  ·  5Comentários  ·  Fonte: querydsl/querydsl

tenho o mesmo problema
http://stackoverflow.com/questions/15869279/does-querydsl-not-support-rand

Estou tentando executar esta consulta.
query.from(test) .orderBy(NumberExpression.random().asc()) .limit(20) .list(test);

É mostrado a consulta
select test0_.id as id1_46_ from test test0_ order by random() asc

E eu recebo esse erro
FUNCTION random does not exist

A versão do MySQL é

mysql Ver 14.14 Distrib 5.7.11, para Linux (x86_64) usando o wrapper EditLine

estou usando querydsl


com.mysema.querydsl
querydsl-apt
3.6.7


com.mysema.querydsl
querydsl-jpa
3.6.7

função RAND() suportada pelo mysql.
http://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_rand

Então, para o mysql, não tenho que usar rand()?

resolved

Comentários muito úteis

Qual provedor de JPA você usa?
Para o Hibernate você pode estender um dialeto e registrar funções personalizadas.

Acabei de lembrar que para outros você também pode usar a função especial function(name, [arg,[arg...]]_ , para chamar funções SQL arbitrárias.
No entanto, isso não funciona no Hibernate .

Em seguida, você pode usar expressões de modelo Querydsl para serializá-las na consulta.

Expressions.numberTemplate(Double.class, "function('rand')");

Todos 5 comentários

Oi,
Parece-me que você está usando JPQL (indicado pela dependência querydsl-jpa ).
JPQL não tem uma função random() , mas você pode fazer seu provedor JPA trocar random() pela função aleatória real específica do dialeto.

@ Shredder121

Obrigado por me avisar.

Por favor, você pode me mostrar como usar o provedor JPA para trocar o random()?

Qual provedor de JPA você usa?
Para o Hibernate você pode estender um dialeto e registrar funções personalizadas.

Acabei de lembrar que para outros você também pode usar a função especial function(name, [arg,[arg...]]_ , para chamar funções SQL arbitrárias.
No entanto, isso não funciona no Hibernate .

Em seguida, você pode usar expressões de modelo Querydsl para serializá-las na consulta.

Expressions.numberTemplate(Double.class, "function('rand')");

@ Shredder121

obrigado :D

o código abaixo é o resultado do sucesso

.orderBy(Expressions.numberTemplate(Double.class, "function('rand')").asc())

se você tiver um erro semelhante como abaixo, use
Expressions.numberTemplate(Double.class, "RAND()"); em vez disso.
Estou usando java spring com mysql

PM org.hibernate.hql.internal.ast.ErrorCounter reportError
ERROR: line 8:25: expecting COMMA, found ')'
line 8:25: expecting COMMA, found ')'
    at antlr.Parser.match(Parser.java:211)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.jpaFunctionSyntax(HqlBaseParser.java:4107)    
Esta página foi útil?
0 / 5 - 0 avaliações