이전 버전의 Hibernate (~ 2009)를 사용하여 행을 어떻게 계산합니까?


242

예를 들어, Books 테이블이 있다면 최대 절전 모드의 총 장부 레코드 수를 어떻게 계산합니까?

답변:


310

이전 버전의 최대 절전 모드 (<5.2)의 경우 :

클래스 이름이 Book이라고 가정합니다.

return (Number) session.createCriteria("Book")
                  .setProjection(Projections.rowCount())
                  .uniqueResult();

적어도 Number, 아마도 Long.


10
길게 반환합니다.
dj_segfault

10
@Salandur가 제안했듯이 "적어도 숫자"이고 숫자 유형에는 "intValue ()", "longValue ()"메소드가 있으므로 원하는 원하는 기본 유형을 쉽게 얻을 수 있습니다 : ((Number) criteria.uniqueResult ()). intValue ()
Jerry Tian

5
문자열 기준을 사용하여 조건 만들기 메소드에 엔티티 맵핑을 찾을 수없는 경우 session.createCriteria (Book.class)를 사용할 수도 있습니다.
Tobias M

5
@MontyBongo가 말했듯이, 실제로 다음과 같은 클래스를 참조해야했습니다. return (Number) session.createCriteria(Book.class).setProjection(Projections.rowCount()).uniqueResult();
bcmoney

2
그런 다음 합리적인 데이터베이스를 사용해서는 안됩니다;). long의 최대 값은 9,223372037 × 10¹⁸이며 laaaaaaaaaarge
Salandur

102

Java에서는 보통 int를 반환 하고이 양식을 사용해야합니다.

int count = ((Long)getSession().createQuery("select count(*) from Book").uniqueResult()).intValue();

1
이 질문에 대한 대답은 저에게 효과가 없었지만 당신의 것입니다. 감사!
Jason Nichols

이것이 쿼리 수를 얻는 가장 빠르고 저렴한 방법입니까? 나는 최대 절전 모드를 의미합니다
kommradHomer

57
어쨌든 SQL 코딩을 끝내면 ORM을 사용하는 요점은 무엇입니까?
thermz

이것이 저의 주요 관심사입니다 (HQL 대신 SQL 사용). 왼쪽 외부 조인 이후에 오는 행 수를 계산하기 위해 중첩 SELECT를 사용해야합니다 (최대 절전 모드에서 왼쪽 외부 조인의 적절한 구현을 찾지 못했습니다).
Pramod

15
우선,이 솔루션은 SQL을 사용하지 않고 HQL입니다. 그리고 'e e의 select count (e)'대신 count (*)를 사용하거나 기준은 @EmbeddedId 및 튜플 수를 지원하지 않는 데이터베이스 (예 : 'select count ((a, b) )에서 작동하지 않습니다).
BrunoJCM

43

다음은 공식 최대 절전 모드 문서에서 우리에게 알려주 는 것입니다 .

쿼리 결과 수를 반환하지 않고 계산할 수 있습니다.

( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue()

그러나 항상 Integer인스턴스를 반환하지는 않으므로 java.lang.Number안전 을 위해 사용하는 것이 좋습니다 .


1
Hibernate 팀이 권장하는 방법을 제공하는 답변에 +1.
Tom

3
저에게 이것은 "java.lang.ClassCastException : java.lang.Long을 java.lang.Integer로 캐스트 할 수 없지만"대신 캐스트로 캐스팅했습니다 ...
rogerdpack

2
@ rogerdpack 이것은 Hibernate가 3.5의 리턴 타입을 Long으로 변경했기 때문이다 : community.jboss.org/wiki/HibernateCoreMigrationGuide35
기계

1
카운트 함수의 리턴 타입은 org.hibernate.dialect.function.StandardAnsiSqlAggregationFunctions.CountFunction( StandardBasicTypes.LONG )
Guillaume Husta에서

12

당신은 시도 할 수 있습니다 count(*)

Integer count = (Integer) session.createQuery("select count(*) from Books").uniqueResult();

데이터베이스의 테이블이 아닌 Books이름이 어디에 있습니까 class?


죄송하지만 Java 및 최대 절전 모드에서 작동하지 않습니다 :( (이 타입 캐스팅 자바에서와 같이 내가 한, 정수로 INT를 교체합니다.)
장인

int 대신 Integer와 함께 작동해야합니까? 클래스 이름을 테이블 이름이 아닌 HQL에 입력해야합니다. 내가 잘못 생각할 수있는 유일한 것입니다
Jon Spokes

1
나는 이것이 바로 아래의 게시물이 핵심 Hibernate 원칙과 더 일치한다고 생각합니다.
Matt Sidesinger

나를 위해 자바와 최대 절전 모드에서 작동하지 않습니다. 대신 무엇을해야합니까?
rParvathi

6

Hibernate 5 이상을 사용하는 경우 쿼리는 다음과 같이 수정됩니다

Long count = session.createQuery("select count(1) from  Book")
                    .getSingleResult();

또는 TypedQuery가 필요한 경우

Long count = session.createQuery("select count(1) from  Book",Long.class)
                        .getSingleResult();

6
Long count = (Long) session.createQuery("select count(*) from  Book").uniqueResult();

```Long count = (Long) session.createQuery ( "Book에서 count (1) 선택") .uniqueResult ();```성능을 향상시킬 것입니다
rajadilipkolli

1

이것은 Hibernate 4 (Tested)에서 작동합니다.

String hql="select count(*) from  Book";
Query query= getCurrentSession().createQuery(hql);
Long count=(Long) query.uniqueResult();
return count;

getCurrentSession ()은 다음과 같습니다.

@Autowired
private SessionFactory sessionFactory;


private Session getCurrentSession(){
return sessionFactory.getCurrentSession();
}

1

다음 JPQL 쿼리를 실행하면 매우 쉽습니다.

int count = (
(Number)
    entityManager
    .createQuery(
        "select count(b) " +
        "from Book b")
    .getSingleResult()
).intValue();

우리가 캐스팅하는 이유는 Number일부 데이터베이스는 반환 Long하고 다른 데이터베이스는 반환 BigInteger하기 때문에 이식성을 위해 계산할 행 수에 따라 a Numberinta 또는 a로 캐스팅하는 것이 좋습니다 long.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.