【问题标题】:Use OrderBy with JPARepository将 OrderBy 与 JPARepository 一起使用
【发布时间】:2018-09-19 23:19:50
【问题描述】:

我有这样的代码:

public interface BatchExecuteHistoryRepository extends JpaRepository<BatchExecuteHistory, Long> {
Page<BatchExecuteHistory> findByBatchExecuteHistoryIdBatchIdOrderByTimeEndAsc(String batchId, Pageable pageable);

}

这是我的数据库:

这是我在我的网站上得到的:

任何人都知道为什么查询不能使用 Order By time_end ASC 吗??? 我尝试了findByBatchExecuteHistoryIdBatchId(String batchId, Pageable pageable) 并得到了相同的结果

注意BatchExecuteHistoryId是一个复合id,batchId是它的一个元素

更新,这是我的 BatchExecuteHistory 类:

public class BatchExecuteHistory implements Serializable {

private static final long serialVersionUID = 1L;

@EmbeddedId
private BatchExecuteHistoryId batchExecuteHistoryId;

@NotNull
@Size(max = 100)
@Column(name = "batch_name", length = 100, nullable = false)
private String batchName;

@NotNull
@Column(name = "status", nullable = false)
private Boolean status;

@NotNull
@Column(name = "time_end", nullable = false)
private Instant timeEnd;

@Size(max = 100)
@Column(name = "error_step", length = 100)
private String errorStep;

@Size(max = 100)
@Column(name = "error_content", length = 100)
private String errorContent;

@Column(name = "row_input")
private Long rowInput;

public BatchExecuteHistoryId getBatchExecuteHistoryId() {
    return batchExecuteHistoryId;
}

public void setBatchExecuteHistoryId(BatchExecuteHistoryId batchExecuteHistoryId) {
    this.batchExecuteHistoryId = batchExecuteHistoryId;
}

public Boolean getStatus() {
    return status;
}

public String getBatchName() {
    return batchName;
}

public BatchExecuteHistory batchName(String batchName) {
    this.batchName = batchName;
    return this;
}

public void setBatchName(String batchName) {
    this.batchName = batchName;
}

public Boolean isStatus() {
    return status;
}

public BatchExecuteHistory status(Boolean status) {
    this.status = status;
    return this;
}

public void setStatus(Boolean status) {
    this.status = status;
}

public Instant getTimeEnd() {
    return timeEnd;
}

public BatchExecuteHistory timeEnd(Instant timeEnd) {
    this.timeEnd = timeEnd;
    return this;
}

public void setTimeEnd(Instant timeEnd) {
    this.timeEnd = timeEnd;
}

public String getErrorStep() {
    return errorStep;
}

public BatchExecuteHistory errorStep(String errorStep) {
    this.errorStep = errorStep;
    return this;
}

public void setErrorStep(String errorStep) {
    this.errorStep = errorStep;
}

public String getErrorContent() {
    return errorContent;
}

public BatchExecuteHistory errorContent(String errorContent) {
    this.errorContent = errorContent;
    return this;
}

public void setErrorContent(String errorContent) {
    this.errorContent = errorContent;
}

public Long getRowInput() {
    return rowInput;
}

public BatchExecuteHistory rowInput(Long rowInput) {
    this.rowInput = rowInput;
    return this;
}

public void setRowInput(Long rowInput) {
    this.rowInput = rowInput;
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((batchExecuteHistoryId == null) ? 0 : batchExecuteHistoryId.hashCode());
    result = prime * result + ((batchName == null) ? 0 : batchName.hashCode());
    result = prime * result + ((errorContent == null) ? 0 : errorContent.hashCode());
    result = prime * result + ((errorStep == null) ? 0 : errorStep.hashCode());
    result = prime * result + ((rowInput == null) ? 0 : rowInput.hashCode());
    result = prime * result + ((status == null) ? 0 : status.hashCode());
    result = prime * result + ((timeEnd == null) ? 0 : timeEnd.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    BatchExecuteHistory other = (BatchExecuteHistory) obj;
    if (batchExecuteHistoryId == null) {
        if (other.batchExecuteHistoryId != null)
            return false;
    } else if (!batchExecuteHistoryId.equals(other.batchExecuteHistoryId))
        return false;
    if (batchName == null) {
        if (other.batchName != null)
            return false;
    } else if (!batchName.equals(other.batchName))
        return false;
    if (errorContent == null) {
        if (other.errorContent != null)
            return false;
    } else if (!errorContent.equals(other.errorContent))
        return false;
    if (errorStep == null) {
        if (other.errorStep != null)
            return false;
    } else if (!errorStep.equals(other.errorStep))
        return false;
    if (rowInput == null) {
        if (other.rowInput != null)
            return false;
    } else if (!rowInput.equals(other.rowInput))
        return false;
    if (status == null) {
        if (other.status != null)
            return false;
    } else if (!status.equals(other.status))
        return false;
    if (timeEnd == null) {
        if (other.timeEnd != null)
            return false;
    } else if (!timeEnd.equals(other.timeEnd))
        return false;
    return true;
}

@Override
public String toString() {
    return "BatchExecuteHistory [" + batchExecuteHistoryId.toString() + ", batchName=" + batchName + ", status="
            + status + ", timeEnd=" + timeEnd + ", errorStep=" + errorStep + ", errorContent=" + errorContent
            + ", rowInput=" + rowInput + "]";
}

}

【问题讨论】:

    标签: java spring-boot jpa spring-data-jpa


    【解决方案1】:

    你应该在OrderBy之前添加一个By,所以你的方法应该是:findByBatchExecuteHistoryIdBatchIdByOrderByTimeEndAsc

    【讨论】:

    【解决方案2】:

    我想你不会错过命名。见Spring document

    订购方式

    findByAgeOrderByLastnameDesc

    ... 其中 x.age = ?1 按 x.lastname desc 排序

    它在我的环境中运行良好。我使用的是 2.6.0 版本。
    我建议您检查 jpa 版本。我看不到您的 BatchExecuteHistoryId 类。

    无论如何,试试看它是否在您的环境中运行良好。

    数据库

    CREATE TABLE MEMBER 
    (
     id character varying(10),
     batch_id character varying(10),
     create_datetime timestamp without time zone NOT NULL,
     CONSTRAINT MEMBER_PK
     PRIMARY KEY (id,batch_id)
    );
    INSERT into MEMBER (id,create_datetime,batch_id) VALUES ('USER1','2021/11/20 14:00:00','1');
    INSERT into MEMBER (id,create_datetime,batch_id) VALUES ('USER2','2021/11/15 14:00:00','1');
    INSERT into MEMBER (id,create_datetime,batch_id) VALUES ('USER3','2021/11/10 14:00:00','1');
    

    实体

    @Entity(name = "Member")
    @Table(name = "member")
    @ToString
    @Data
    public class MemberEntity {
    
        @EmbeddedId
        private MemberPk batchExecuteHistoryId;
        
        @Column(name = "create_datetime")
        private LocalDateTime createDateTime;
    }
    

    实体的PK

    @Embeddable
    @ToString
    public class MemberPk implements Serializable {
        
        private static final long serialVersionUID = 1L;
        
        private String id; 
        
        @Column(name = "batch_id")
        private String batchId;
    }
    

    存储库

    @Repository
    public interface MemberRepository extends JpaRepository<MemberEntity, String> {
        
        public List<MemberEntity> findByBatchExecuteHistoryIdBatchIdOrderByCreateDateTimeAsc(String batchId, Pageable pageable);
    
    }
    

    服务

    @Service
    public class MemberService {
    
        private final MemberRepository memberRepository;
    
        @Autowired
        public MemberService(MemberRepository memberRepository) {
            this.memberRepository = memberRepository;
        }
        
        @PostConstruct
        public void findAllMember() {
            List<MemberEntity> memberEntitys = memberRepository.findAll();
            
            //MemberEntity(batchExecuteHistoryId=MemberPk(id=USER1, batchId=1), createDateTime=2021-11-20T14:00)
            //MemberEntity(batchExecuteHistoryId=MemberPk(id=USER2, batchId=1), createDateTime=2021-11-15T14:00)
            //MemberEntity(batchExecuteHistoryId=MemberPk(id=USER3, batchId=1), createDateTime=2021-11-10T14:00)
            memberEntitys.forEach(System.out::println); 
            
            System.out.println("----------------------------");
            
            //MemberEntity(batchExecuteHistoryId=MemberPk(id=USER3, batchId=1), createDateTime=2021-11-10T14:00)
            //MemberEntity(batchExecuteHistoryId=MemberPk(id=USER2, batchId=1), createDateTime=2021-11-15T14:00)
            List<MemberEntity> memberEntitysWithOrderBy = memberRepository.findByBatchExecuteHistoryIdBatchIdOrderByCreateDateTimeAsc("1",PageRequest.of(0, 2));
            
            memberEntitysWithOrderBy.forEach(System.out::println);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-10-07
      • 2012-05-25
      • 2020-03-09
      • 2022-07-26
      • 2022-01-04
      • 2015-12-26
      • 2017-01-24
      • 2010-10-10
      • 2016-02-28
      相关资源
      最近更新 更多