복붙노트

[SPRING] Hibernate는 폐 대신 BigInteger를 리턴한다.

SPRING

Hibernate는 폐 대신 BigInteger를 리턴한다.

내 발신자 엔티티입니다.

@Entity
public class Sender {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long senderId;
...


...

    public long getSenderId() {
            return senderId;
    }

    public void setSenderId(long senderId) {
            this.senderId = senderId;
    }
}

다음 쿼리를 실행하려고하면 :

StringBuilder query = new StringBuilder();
query.append("Select sender.* ");
query.append("From sender ");
query.append("INNER JOIN coupledsender_subscriber ");
query.append("ON coupledsender_subscriber.Sender_senderId = sender.SenderId ");
query.append("WHERE coupledsender_subscriber.Subscriber_subscriberId = ? ");

SQLQuery q = (SQLQuery) sessionFactory.getCurrentSession().createSQLQuery(query.toString());
q.setResultTransformer(Transformers.aliasToBean(Sender.class));
q.setLong(0, subscriberId);

return q.list();

다음 오류가 발생했습니다 :

이것은, Sender 클래스의 senderId가 실제로 Hibernate에 의해 반환되는 BigInteger 대신에 long이기 때문에 발생합니다.

가장 좋은 방법이 이런 경우에 무엇이 었는지 궁금 해서요. Big Integers를 그대로 사용해야합니까 (약간의 잔인 함이 보입니다)?

쿼리 결과를 수동으로 클래스 Sender 클래스의 객체로 변환해야합니까? 아니면 그냥 하이버 네이트가 BigIntegers 대신에 긴 ID를 리턴하도록 할 수 있습니까? 아니면 다른 아이디어?

저는 Spring, Hibernate 4.1.1과 MySQL을 사용하고 있습니다.

해결법

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

    1.최대 절전 모드에서 ".list ()"의 기본값은 Numeric의 BigInteger 반환 유형 인 것으로 보입니다. 다음은 한 가지 해결 방법입니다.

    최대 절전 모드에서 ".list ()"의 기본값은 Numeric의 BigInteger 반환 유형 인 것으로 보입니다. 다음은 한 가지 해결 방법입니다.

    session.createSQLQuery("select column as num from table")
      .addScalar("num", StandardBasicTypes.LONG).list();
    
  2. ==============================

    2.개체 데이터베이스 매핑이 잘못되었습니다. 데이터베이스 필드가 BigInteger이지만 캐스팅 예외가 있지만 객체 속성이 길다.

    개체 데이터베이스 매핑이 잘못되었습니다. 데이터베이스 필드가 BigInteger이지만 캐스팅 예외가 있지만 객체 속성이 길다.

    BigInteger는, 무제한의 사이즈의 정수 치를 보관 유지하는 특수한 클래스입니다. 게다가 BigInteger는 암묵적으로 오랫동안 캐스트 할 수 없습니다.

    BigInteger이 오류 데이터베이스 필드를 피하려면 긴 호환 유형으로 변경해야합니다. int를 int 형식으로 변경하십시오. int는 암시 적으로 long으로 형변환 될 수 있습니다. BigInteger를 참조하십시오.

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

    3.#Headley 주석에 추가하여 전역으로 수정하면 SQL Dialect 생성자에 행을 추가 할 수 있습니다. 내 프로젝트에서 그것은 같았다.

    #Headley 주석에 추가하여 전역으로 수정하면 SQL Dialect 생성자에 행을 추가 할 수 있습니다. 내 프로젝트에서 그것은 같았다.

    public PostgreSQLDialect() {
            super();
            registerHibernateType(Types.BIGINT, StandardBasicTypes.LONG.getName());
        }
    
  4. ==============================

    4.이전 버전의 Hibernate에서는

    이전 버전의 Hibernate에서는

      session.createSQLQuery("select column as num from table")
     .addScalar("num", Hibernate.LONG).list();
    
  5. ==============================

    5.다음 링크에서 확인할 수 있습니다. BigInteger ID 생성기 클래스를 보려면 여기를 확인하십시오.

    다음 링크에서 확인할 수 있습니다. BigInteger ID 생성기 클래스를 보려면 여기를 확인하십시오.

  6. from https://stackoverflow.com/questions/18758347/hibernate-returns-bigintegers-instead-of-longs by cc-by-sa and MIT license