2013-04-07 3 views
3

내가 좋아하는 SQL의 모습 만들고 싶어?Querydsl은 rand()를 지원하지 않습니까?</p> <pre>select b from Book b order by rand()</pre> <p>방법 Querydsl 쿼리에 해당 쿼리를 변환 :

Querydsl에서 지원하지 않습니까? 이 쿼리를 지원하는 방법을 알고 있다면 대답하십시오 ..;

감사합니다.

+0

'rand'란 무엇입니까? 어떤 RDBMS에서 이것을 실행하려고합니까? –

+0

rand() 메소드는 RDBMS 기능입니다. 나는 mysql과 함께 사용했다. – xyzlast

답변

7

Querydsl SQL은 될 것 같지 않습니다, 나는 그것이 JPQL 지원됩니다 얼마나 잘되지 확신 그래서 귀하의 요청이

query.from(b) 
    .orderBy(NumberExpression.random().asc()) 
    .list(b); 

과 같이 표현 될 수

NumberExpression.random() 

통해 지원 표준에서.

+0

티모 감사합니다! – xyzlast

+0

Timo. "ERROR : FUNCTION bookstore_web.random이 없습니다"라는 오류가 발생합니다. 제 환경은 QueryDSL 3.1과 Hibernate 4.1.10입니다. 최종. – xyzlast

+0

Querydsl SQL을 지원합니다. 지원하는 JPQL을 모르며 SQL을 요청했습니다. –

1

티모의 답변에 추가.

mysql을 사용하면 "ERROR : FUNCTION schema.random does not exist"오류가 발생합니다. 이는 mysql이 RANDOM 함수 대신 RAND 함수를 가지고 있기 때문입니다. 다음과 같이

public class MySQLJPATemplates extends JPQLTemplates { 

    public static final MySQLJPATemplates DEFAULT = new MySQLJPATemplates(); 

    public MySQLJPATemplates() { 
     this(DEFAULT_ESCAPE); 
     add(Ops.MathOps.RANDOM, "rand()"); 
     add(Ops.MathOps.RANDOM2, "rand({0})"); 
    } 

    public MySQLJPATemplates(char escape) { 
     super(escape); 
    } 
} 

그리고 템플릿을 사용 :

DROP FUNCTION IF EXISTS RANDOM; 

DELIMITER $$ 
CREATE FUNCTION RANDOM() 
RETURNS DECIMAL(15,15) 
DETERMINISTIC 
BEGIN 
    DECLARE dist DECIMAL(15,15); 
    SET dist = RAND(); 
    RETURN dist; 
END$$ 
DELIMITER ; 

을 또는 함께 랜드를 사용하는 임의의 기능을 수정 :이 문제를 해결하려면 당신도 다음과 같이 SQL에서 임의의 기능을 추가 할 수 있습니다

JPAQuery<Route> query = new JPAQuery<Route>(em, MySQLJPATemplates.DEFAULT); 
query.from(b) 
    .orderBy(NumberExpression.random().asc()) 
    .list(b);