이전 버전의 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 Number및 inta 또는 a로 캐스팅하는 것이 좋습니다 long.

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