복붙노트

[SQL] 최대 절전 모드 기준 API : GET n은 임의 행

SQL

최대 절전 모드 기준 API : GET n은 임의 행

나는 기준 인스턴스에서 n은 임의 행을 인출하는 방법을 알아낼 수 없습니다 :

Criteria criteria = session.createCriteria(Table.class);
criteria.add(Restrictions.eq('fieldVariable', anyValue));
...

그리고 뭐? 내가 기준 API있는 모든 문서를 찾을 수 없습니다

내가 대신 HQL을 사용한다는 의미 하는가?

고맙습니다!

편집 : 나는에 의한 행의 수를 얻을 :

int max = criteria.setProjecxtion(Projections.rowCount()).uniqueResult();

어떻게하면 0에서 최대 사이의 인덱스 임의 행 N을 가져올 수 있습니까? 들으 다시!

해결법

  1. ==============================

    1.사실 그것은 기준 및 조정이 조금 가능합니다. 여기 방법입니다 :

    사실 그것은 기준 및 조정이 조금 가능합니다. 여기 방법입니다 :

    Criteria criteria = session.createCriteria(Table.class);
    criteria.add(Restrictions.eq("fieldVariable", anyValue));
    criteria.add(Restrictions.sqlRestriction("1=1 order by rand()"));
    criteria.setMaxResults(5);
    return criteria.list();
    

    어떤 Restrictions.sqlRestriction 키워드 '및'를 추가합니다; 그래서 그 효과를 무효로하고, 우리는 더미 조건을 추가하고 우리 랜드 () 함수를 주입하여야한다.

  2. ==============================

    2.우선, SQL에서이 작업을 수행하는 표준 방법이 없다는 것을 알고, 각 데이터베이스 엔진은 독자적인 구문 1을 사용합니다. MySQL과 SQL 문은 5 개 무작위 행이 될 것이다 얻을 :

    우선, SQL에서이 작업을 수행하는 표준 방법이 없다는 것을 알고, 각 데이터베이스 엔진은 독자적인 구문 1을 사용합니다. MySQL과 SQL 문은 5 개 무작위 행이 될 것이다 얻을 :

    SELECT column FROM table
    ORDER BY RAND()
    LIMIT 5
    

    당신이 어떤 기능을 사용할 수 있도록 HQL에서 ORDER BY 절은 데이터베이스를 통해 전달되기 때문에 그리고 당신은 HQL에서이 쿼리를 작성할 수 있습니다.

    String query = "SELECT e.attribute FROM MyEntity e ORDER BY RAND()";
    Query q = em.createQuery(query);
    q.setMaxResults(5);
    

    그러나 HQL과 달리 기준 API가 현재 ORDER BY 네이티브 SQL을 지원하지 않습니다 (HHH-2381 참조), 현재 상태에서이 기능을 구현하기 위해 주문 클래스를 서브 클래 싱해야합니다. 이 행할 수는 락스 문제를 참조하지만, 상자를 사용할 수 없습니다 아웃.

    정말 당신이 쿼리를 필요로한다면, 내 추천은 HQL을 사용하는 것입니다. 그냥 휴대용되지 않습니다 점에 유의하십시오.

    (1 개) 다른 독자는 MySQL은, PostgreSQL을, 마이크로 소프트 SQL 서버, IBM DB2와 오라클과이를 구현하는 방법을 확인하기 위해 데이터베이스 테이블에서 임의의 행을 선택하는 포스트 SQL을 확인 할 수 있습니다.

  3. ==============================

    3.기준 API는이 시설을 제공하지 않습니다. 그러나 MySQL은, 당신은 여기서 n은 가져 싶은 임의 행의 수를 나타냅니다 이에 대한 ORDER BY RAND () LIMIT를 사용할 수 있습니다.

    기준 API는이 시설을 제공하지 않습니다. 그러나 MySQL은, 당신은 여기서 n은 가져 싶은 임의 행의 수를 나타냅니다 이에 대한 ORDER BY RAND () LIMIT를 사용할 수 있습니다.

    SELECT col1, col2, col3 FROM tbl ORDER BY RAND() LIMIT :n
    

    당신은 참으로 HQL로 실행해야합니다.

  4. ==============================

    4.당신은 죄송합니다, 효율적으로 임의의 행을 가져올 수 없습니다. 최대 절전 모드는 SQL이 무엇을 할 수 있고, 임의 행은 단순히 내가 아는 모든 표준 SQL 구현의 일부가 아닌 가져 - 사실은 내 지식에 나는 (누군가가 나를 ENLIGHT하시기 바랍니다) 알고임을 모든 SQL의 일부입니다.

    당신은 죄송합니다, 효율적으로 임의의 행을 가져올 수 없습니다. 최대 절전 모드는 SQL이 무엇을 할 수 있고, 임의 행은 단순히 내가 아는 모든 표준 SQL 구현의 일부가 아닌 가져 - 사실은 내 지식에 나는 (누군가가 나를 ENLIGHT하시기 바랍니다) 알고임을 모든 SQL의 일부입니다.

    최대 절전 모드는 O / R 매퍼, 그리고 궁금 기계 같이, 그것은 것만 기본 데이터베이스 지원을 할 수 있습니다.

    당신이이 상승하는 번호에 제출 알고와 시작 및 종료 알고 있다면, 당신은 컴퓨터의 난수를 생성하고 해당 행을 요청할 수 있습니다.

  5. ==============================

    5.당신이 동적 기준을 생성하는 경우 @PSV 바트에 의한 답변은 어렵습니다. 여기에 최대 절전 주문 클래스를 확장하는 솔루션입니다 :

    당신이 동적 기준을 생성하는 경우 @PSV 바트에 의한 답변은 어렵습니다. 여기에 최대 절전 주문 클래스를 확장하는 솔루션입니다 :

    import org.hibernate.Criteria;
    import org.hibernate.criterion.Order;
    
    private void addOrderByToCriteria(Criteria criteria) {
        criteria.addOrder(Order.asc("foobar"));
        criteria.addOrder(ORDER_RANDOM);
    }
    
    private static final OrderRandom ORDER_RANDOM = new OrderRandom();
    
    private static class OrderRandom extends Order {
        public OrderRandom() {
            super("", false);
        }
        @Override
        public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) {
            return "RANDOM()"; // or RAND() or whatever this is in your dialect
        }
    }
    
  6. from https://stackoverflow.com/questions/2810693/hibernate-criteria-api-get-n-random-rows by cc-by-sa and MIT license