I have the data class Request which name corresponds the BD table
package entities;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.CreationTimestamp;
import entities.securityservice.User;
import java.math.BigInteger;
import java.time.LocalDateTime;
import java.util.List;
import java.util.UUID;
import static Constants.REQUEST_TABLE_NAME;
import static Constants.SCHEMA;
@Entity
@Getter
@Setter
@Table(schema = SCHEMA, name = REQUEST_TABLE_NAME)
public class Request {
@Id
@Column(name = "messid")
private UUID messId;
@Column(name = "typeid", nullable = false)
private Integer typeId;
@Column(name = "answerdate")
private LocalDateTime answerDate;
@Column(name = "createuserid")
private BigInteger createUserId;
@Column(name = "departmentid")
private BigInteger departmentId;
@Column(name = "answeruserid")
private Integer answerUserId;
@CreationTimestamp
@Column(name = "createdate")
private LocalDateTime createDate;
@Column(name = "requestdate")
private LocalDateTime requestDate;
@ColumnDefault("0")
@Column(name = "exportstatus", nullable = false)
private Integer exportStatus = 0;
@Column(name = "replyto", length = 4000)
private String replyTo;
@Column(name = "errormsg", length = 4000)
private String errorMsg;
@Column(name = "entityid")
private UUID entityId;
@Column(name = "isfromui", nullable = false)
private Integer isFromUi = 0;
@Column(name = "sendermnemonic", length = 4000)
private String senderMnemonic;
@Column(name = "sendername", length = 4000)
private String senderName;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "request")
private List<Response> response;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "typeid", insertable = false, updatable = false)
private RequestType kind;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "exportstatus", referencedColumnName = "code", insertable = false, updatable = false)
private RequestStatus status;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "messid", insertable = false, updatable = false)
private RequestData requestData;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "createuserid", referencedColumnName = "id", insertable = false, updatable = false)
private User createUser;
}
Response class:
package entities;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.CreationTimestamp;
import java.math.BigInteger;
import java.time.LocalDateTime;
import java.util.UUID;
import static Constants.RESPONSE_TABLE_NAME;
import static Constants.SCHEMA;
@Entity
@Getter
@Setter
@Table(schema = SCHEMA, name = RESPONSE_TABLE_NAME)
public class Response {
@Id
@Column(name = "messid")
public UUID messId;
@Column(name = "typeid", nullable = false)
public Integer typeId;
@Column(name = "requestmessid")
public UUID requestMessId;
@Column(name = "answerdate")
public LocalDateTime answerDate;
@Column(name = "createuserid")
public BigInteger createUserId;
@Column(name = "departmentid")
public BigInteger departmentId;
@Column(name = "answeruserid")
public Integer answerUserId;
@CreationTimestamp
@Column(name = "createdate")
public LocalDateTime createDate;
@Column(name = "requestdate")
public LocalDateTime requestDate;
@Column(name = "exportstatus", nullable = false)
public Integer exportStatus;
@Column(name = "errormsg", length = 4000)
public String errormsg;
@Column(name = "sendermnemonic", length = 4000)
private String senderMnemonic;
@Column(name = "sendername", length = 4000)
private String senderName;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumns(
{
@JoinColumn(name = "requestmessid", referencedColumnName="messid", insertable = false, updatable = false),
@JoinColumn(name = "typeid", referencedColumnName="typeid",insertable = false, updatable = false)
})
private Request request;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "exportstatus", referencedColumnName = "code", insertable = false, updatable = false)
private RequestStatus status;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "messid", insertable = false, updatable = false)
private ResponseData responseData;
}
Repository class:
package repo.common;
import jakarta.transaction.Transactional;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.*;
import org.springframework.data.repository.query.Param;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Repository;
import entities.Request;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
@Repository
public interface RequestRepo extends JpaRepository<Request, UUID>, JpaSpecificationExecutor<Request> {
/*other code*/
@EntityGraph(attributePaths = {"response.status", "kind.direction", "status", "requestData", "createUser", "response.responseData"})
Optional<Request> findOne(@Nullable Specification<Request> spec);
}
The problem is when I’m trying to fetch the data with
Optional req = RequestRepo.findOne(spec);
I get the result, but despite I have 6 records in Response DB table, I get only 2 of them in the code.
But if I try not to use the findOne method and use something like
@Query("select s from Request s where s.typeId = ?1 and s.messId = ?2")
Optional<Request> findResponses(Integer typeId, UUID messId);
and change FetchType.LAZY to FetchType.EAGER, then all my responses are fetched correctly.
Why findOne fetches only 2 responses and cannot fetch all of them?