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()?
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)
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.