Hibernate, Spring, MySQL 5.7, Lombok을 사용한 중복 결과

vphilipnyc

다음과 같은 간단한 코드가 있습니다.

@Transactional(readOnly = true, timeout = 10)
public List<MyClass> findThem() {

    Criteria criteria = getSession().createCriteria(MyClass.class);

    @SuppressWarnings("unchecked")
    List<MyClass> theList = criteria.list();
    return theList;
}

이 쿼리를 사용하면 목록에 중복 된 항목이있는 942 개의 항목이 반환됩니다. 아직 복제 된 패턴이 보이지 않습니다.

DB로 직접 쿼리하면 138 개의 레코드가 반환됩니다. 138은 올바른 결과 수입니다.

SELECT count(*) FROM theschema.MY_CLASS;

나는 Lombok이 @EqualsAndHashCode(exclude="id")켜져 있거나없는 클래스를 사용하고 구현을 MyClass포함하지 않았 equals()으며 이것이 원인이라고 생각했지만 운이 없었습니다.

최근에 MySQL 5.6에서 MySQL 5.7.17로 업그레이드했지만 여전히 Hibernate 4.3.8.Final 및 HikariCP 2.5.1을 사용하고 있습니다. 쿼리에는 WHERE절이나 매우 복잡한 것이 없습니다 . 중요하지 않을 수도 있지만 mysql-connector-java 5.1.39와 함께 Spring 4.3.3.RELEASE에 있습니다.

볼만한 다른 제안이 있습니까? 더 많은 디버그 로깅을 켜고 그 동안 자세히 살펴 보겠습니다.

업데이트 :

나는 할 수있어 이 문제를 해결criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);하지만 확실히 지금 필요한 이유.

업데이트 2

여기 MyClass. 더 기본적인 속성이 있지만 간결성을 위해 발췌했습니다. 일부 이름은 개인 정보 보호를 위해 이름이 변경되었습니다.

import base.domain.model.Persistable;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.validator.constraints.NotEmpty;

import javax.persistence.*;
import java.math.BigDecimal;
import java.util.*;

@NoArgsConstructor
@Entity
@Table(name = "MY_CLASS")
public class MyClass implements Persistable {

    @Getter
    @Setter
    @Id
    @Column(name = "MY_CLASS_ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Getter
    @Setter
    private ClassB classb;

    @Getter
    @Setter
    @ManyToOne
    @JoinColumn(name = "CLASS_C_ID")
    private ClassC classC;

    @Getter
    @Setter
    @Transient
    private Integer daysOpen;

    @Getter
    @Setter
    @OneToOne
    @JoinColumn(name = "CLASS_D_ID")
    private ClassD classD;

    @Getter
    @Setter
    @NotEmpty
    private String briefDescription;

    @Getter
    @Setter
    @Column(length = 1000)
    private String details;

    @Getter
    @Setter
    @OneToOne
    @JoinColumn(name = "COMPANY_ID")
    private Company company;

    @Getter
    @Setter
    @Transient
    private BigDecimal cost;

    @Getter
    @Setter
    @ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
    @JoinTable(name = "MY_CLASS_TAG",
            foreignKey = @ForeignKey(name = "FK_MY_CLASS_TAG_REQUEST"),
            joinColumns = @JoinColumn(name = "MY_CLASS_ID"),
            inverseJoinColumns = @JoinColumn(name = "TAG_ID"))
    private Set<Tag> tags = new HashSet<>(10);

    @Getter
    @Setter
    @ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
    @JoinTable(name = "MY_CLASS_ASSIGNEE",
            foreignKey = @ForeignKey(name = "FK_MY_CLASS_ASSIGNEE"),
            joinColumns = @JoinColumn(name = "MY_CLASS_ID"),
            inverseJoinColumns = @JoinColumn(name = "ASSIGNEE_ID"))
    private Set<Account> assignees = new HashSet<>(0);

    @Getter
    @Setter
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "myClass")
    private List<MyClassHistory> historyList = new ArrayList<>(1);

    private static final long serialVersionUID = 1L;
}

업데이트 3 :

결과 변환기없이 HQL (요약)을 사용하여 올바른 결과를 얻을 수도 있습니다.

    String hql = "from MyClass myClass";
    Query q = getSession().createQuery(hql);
    List<MyClass> myClasses = q.list();
    return myClasses;

각각에 대한 SQL 출력을 비교하려고합니다 (이해해야 할 출력이 많습니다).

Prateek Singh

쿼리에서 발생하는 조인이 있어야만 결과 집합이 증가하므로 횟수가 증가합니다. 종종 비슷한 문제가 발생하면 목록 대신 Set에서 데이터를 가져 오거나 DB에서 발생한 실제 쿼리를 관찰 할 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다debugcn@gmail.com 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Spring Hibernate : 다중 결과 집합 매핑

분류에서Dev

mysql 조인 쿼리 사용시 중복 결과

분류에서Dev

다중 조인을 사용하는 mysql sum () 및 이중 결과

분류에서Dev

MySQL 오류 중복 결과

분류에서Dev

Hibernate를 사용하여 한 번에 모든 결과를로드하지 않고 결과 집합을 반복하는 관용적 방법은 무엇입니까?

분류에서Dev

Grails 3을 사용한 Hibernate 5 검색

분류에서Dev

MYSQL의 중복 행에있는 모든 고유 값을 사용하여 중복 결과를 하나의 집합으로 가져옵니다.

분류에서Dev

Java Spring Hibernate 중복 값을 MySQL 테이블에 저장하면 오류가 발생합니다.

분류에서Dev

DISTINCT 절을 사용하더라도 뷰의 중복 결과

분류에서Dev

mysql 내부 조인을 사용한 고유 한 결과

분류에서Dev

mysql 내부 조인을 사용한 고유 한 결과

분류에서Dev

중복 된 열 이름과 MySQL을 사용 흔적을 가입 전체에서 중복

분류에서Dev

Spring, Hibernate 및 C3P0을 사용하여 다중 테넌트 웹 앱에서 연결 풀링 관리

분류에서Dev

mysql은 4, 5, 6, 7 결과를 얻습니다.

분류에서Dev

@Autowired 결과 NullPointerException을 사용한 Spring 서비스 주입

분류에서Dev

MySQL 선택 결과에서 중복 행을 지능적으로 결합

분류에서Dev

조인 테이블을 사용한 MySQL Greatest N 결과

분류에서Dev

MySQL 쿼리, 동일한 값을 가진 행 수를 5 개 결과로 제한

분류에서Dev

Hibernate를 사용한 중첩 된 Spring 트랜잭션

분류에서Dev

Spring을 사용한 MySQL 구성

분류에서Dev

Spring Boot를 사용하여 Excel 파일을 읽는 동안 MySQL에 중복을 삽입하지 마십시오.

분류에서Dev

중복 된 사용자 이름 결과

분류에서Dev

md5 암호를 사용하여 wordpress를 mysql과 연결

분류에서Dev

중복 값을 사용하는 오라클 검색-중복 결과를 반환하는 방법

분류에서Dev

중복 값을 사용하는 오라클 검색-중복 결과를 반환하는 방법

분류에서Dev

pandas groupby (). transform ()과 tolist ()를 집계 자로 사용하여 중복을 결합

분류에서Dev

JASYPT + Hibernate + Spring을 사용한 문자열 암호화

분류에서Dev

Hibernate와 Spring을 사용한 일대 다 매핑

분류에서Dev

LISTAGG 함수를 사용한 중복 결과

Related 관련 기사

  1. 1

    Spring Hibernate : 다중 결과 집합 매핑

  2. 2

    mysql 조인 쿼리 사용시 중복 결과

  3. 3

    다중 조인을 사용하는 mysql sum () 및 이중 결과

  4. 4

    MySQL 오류 중복 결과

  5. 5

    Hibernate를 사용하여 한 번에 모든 결과를로드하지 않고 결과 집합을 반복하는 관용적 방법은 무엇입니까?

  6. 6

    Grails 3을 사용한 Hibernate 5 검색

  7. 7

    MYSQL의 중복 행에있는 모든 고유 값을 사용하여 중복 결과를 하나의 집합으로 가져옵니다.

  8. 8

    Java Spring Hibernate 중복 값을 MySQL 테이블에 저장하면 오류가 발생합니다.

  9. 9

    DISTINCT 절을 사용하더라도 뷰의 중복 결과

  10. 10

    mysql 내부 조인을 사용한 고유 한 결과

  11. 11

    mysql 내부 조인을 사용한 고유 한 결과

  12. 12

    중복 된 열 이름과 MySQL을 사용 흔적을 가입 전체에서 중복

  13. 13

    Spring, Hibernate 및 C3P0을 사용하여 다중 테넌트 웹 앱에서 연결 풀링 관리

  14. 14

    mysql은 4, 5, 6, 7 결과를 얻습니다.

  15. 15

    @Autowired 결과 NullPointerException을 사용한 Spring 서비스 주입

  16. 16

    MySQL 선택 결과에서 중복 행을 지능적으로 결합

  17. 17

    조인 테이블을 사용한 MySQL Greatest N 결과

  18. 18

    MySQL 쿼리, 동일한 값을 가진 행 수를 5 개 결과로 제한

  19. 19

    Hibernate를 사용한 중첩 된 Spring 트랜잭션

  20. 20

    Spring을 사용한 MySQL 구성

  21. 21

    Spring Boot를 사용하여 Excel 파일을 읽는 동안 MySQL에 중복을 삽입하지 마십시오.

  22. 22

    중복 된 사용자 이름 결과

  23. 23

    md5 암호를 사용하여 wordpress를 mysql과 연결

  24. 24

    중복 값을 사용하는 오라클 검색-중복 결과를 반환하는 방법

  25. 25

    중복 값을 사용하는 오라클 검색-중복 결과를 반환하는 방법

  26. 26

    pandas groupby (). transform ()과 tolist ()를 집계 자로 사용하여 중복을 결합

  27. 27

    JASYPT + Hibernate + Spring을 사용한 문자열 암호화

  28. 28

    Hibernate와 Spring을 사용한 일대 다 매핑

  29. 29

    LISTAGG 함수를 사용한 중복 결과

뜨겁다태그

보관