按日期字段排序在 Spring Data JPA 中不起作用
Order By a date field not working in Spring Data JPA
我正在尝试使用 DESC 获取按日期排序的数据,但我总是使用 ASC 获取数据,
我尝试了两种方法,但都没有好的结果:
我有这个存储库:
@Repository
public interface CollectRepository extends JpaRepository<Collect, Long>
第一种方式,我在@query中使用了排序:
@Query("SELECT c FROM Collect c LEFT JOIN c.payee p WHERE p.userId=:userId AND c.date BETWEEN :startDate AND :endDate ORDER BY c.date DESC")
List<Collect> getCollectionHistory(@Param("userId") String userId,
@Param("startDate") Date startDate,
@Param("endDate") Date endDate);
第二种方式,我使用了排序
@Query("SELECT c FROM Collect c LEFT JOIN c.payee p WHERE p.userId=:userId AND c.date BETWEEN :startDate AND :endDate")
List<Collect> getCollectionHistory(@Param("userId") String userId,
@Param("startDate") Date startDate,
@Param("endDate") Date endDate, Sort sort);
并使用 :
调用函数
collectionList = collectRepository.getCollectionHistoryByCollector(userId, startDate, endDate, new Sort(Direction.DESC, "date"));
收集实体
@Entity
@Table(name = "collect")
@SequenceGenerator(name = "SEQ", sequenceName = "collect_id_seq", allocationSize = 1)
@AttributeOverride(name = "id", column = @Column(name = "collect_id", nullable = false))
public class Collect extends GenericEntity {
@Column(name = "collector_user_id")
private String collectorUserId;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "payer")
private Payer payer;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "payee")
private Payee payee;
@Column(name = "amount", precision = 5)
private BigDecimal amount;
@Column(name = "date", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
@JsonSerialize(using = IsoDateSerializer.class)
private Date date;
@Column(name = "reason")
private String reason;
@Column(name = "reference")
private String reference;
// getters and setters
收款人实体:
@Entity
@Table(name = "payee")
@SequenceGenerator(name = "SEQ", sequenceName = "payee_id_seq", allocationSize = 1)
@AttributeOverride(name = "id", column = @Column(name = "payee_id", nullable = false))
public class Payee extends GenericEntity {
private String userId;
@OneToMany(mappedBy = "payee", cascade = CascadeType.ALL)
private List<Collect> collects;
@OneToMany(mappedBy = "payee", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<PayeePayer> payeePayers;
我正在使用 Spring Data JPA 版本:1.10.5.RELEASE
这是错误还是我的代码有问题?
我该如何解决这个问题?
下面的方法将 return 一个 Collect
的列表 date
在 start
和 end
之间并且 payee
id payeeId
。一旦您将 Payee
添加到问题中,我就可以调整模型。
List<Collect> findAllByPayeeUserIdAndDateBetweenOrderByDateDesc(String payeeUserId, Date start, Date end);
你能试试这个吗:
List<Collect> findByPayeeUserIdAndDateBetweenOrderByDateDesc(String payeeUserId, Date start, Date end);
或
List<Collect> findByPayeeUser_IdAndDateBetweenOrderByDateDesc(String payeeUserId, Date start, Date end);
对于第二个,我的一个项目有一个类似的存储库,它是这样的:
import com.buhane.property.domain.entity.Lease;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface LeaseRepository extends PagingAndSortingRepository<Lease, Long> {
Page<Lease> findByApplicationId(Long applicationId, Pageable page);
Page<Lease> findByApplicationProperty_Id(Long propertyId, Pageable page);
List<Lease> findByApplicationIdAndActiveTrue(Long applicationId);
}
请注意行
Page<Lease> findByApplicationProperty_Id(Long propertyId, Pageable page);
它运行良好:)
我正在尝试使用 DESC 获取按日期排序的数据,但我总是使用 ASC 获取数据, 我尝试了两种方法,但都没有好的结果:
我有这个存储库:
@Repository
public interface CollectRepository extends JpaRepository<Collect, Long>
第一种方式,我在@query中使用了排序:
@Query("SELECT c FROM Collect c LEFT JOIN c.payee p WHERE p.userId=:userId AND c.date BETWEEN :startDate AND :endDate ORDER BY c.date DESC")
List<Collect> getCollectionHistory(@Param("userId") String userId,
@Param("startDate") Date startDate,
@Param("endDate") Date endDate);
第二种方式,我使用了排序
@Query("SELECT c FROM Collect c LEFT JOIN c.payee p WHERE p.userId=:userId AND c.date BETWEEN :startDate AND :endDate")
List<Collect> getCollectionHistory(@Param("userId") String userId,
@Param("startDate") Date startDate,
@Param("endDate") Date endDate, Sort sort);
并使用 :
调用函数collectionList = collectRepository.getCollectionHistoryByCollector(userId, startDate, endDate, new Sort(Direction.DESC, "date"));
收集实体
@Entity
@Table(name = "collect")
@SequenceGenerator(name = "SEQ", sequenceName = "collect_id_seq", allocationSize = 1)
@AttributeOverride(name = "id", column = @Column(name = "collect_id", nullable = false))
public class Collect extends GenericEntity {
@Column(name = "collector_user_id")
private String collectorUserId;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "payer")
private Payer payer;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "payee")
private Payee payee;
@Column(name = "amount", precision = 5)
private BigDecimal amount;
@Column(name = "date", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
@JsonSerialize(using = IsoDateSerializer.class)
private Date date;
@Column(name = "reason")
private String reason;
@Column(name = "reference")
private String reference;
// getters and setters
收款人实体:
@Entity
@Table(name = "payee")
@SequenceGenerator(name = "SEQ", sequenceName = "payee_id_seq", allocationSize = 1)
@AttributeOverride(name = "id", column = @Column(name = "payee_id", nullable = false))
public class Payee extends GenericEntity {
private String userId;
@OneToMany(mappedBy = "payee", cascade = CascadeType.ALL)
private List<Collect> collects;
@OneToMany(mappedBy = "payee", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<PayeePayer> payeePayers;
我正在使用 Spring Data JPA 版本:1.10.5.RELEASE
这是错误还是我的代码有问题? 我该如何解决这个问题?
下面的方法将 return 一个 Collect
的列表 date
在 start
和 end
之间并且 payee
id payeeId
。一旦您将 Payee
添加到问题中,我就可以调整模型。
List<Collect> findAllByPayeeUserIdAndDateBetweenOrderByDateDesc(String payeeUserId, Date start, Date end);
你能试试这个吗:
List<Collect> findByPayeeUserIdAndDateBetweenOrderByDateDesc(String payeeUserId, Date start, Date end);
或
List<Collect> findByPayeeUser_IdAndDateBetweenOrderByDateDesc(String payeeUserId, Date start, Date end);
对于第二个,我的一个项目有一个类似的存储库,它是这样的:
import com.buhane.property.domain.entity.Lease;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface LeaseRepository extends PagingAndSortingRepository<Lease, Long> {
Page<Lease> findByApplicationId(Long applicationId, Pageable page);
Page<Lease> findByApplicationProperty_Id(Long propertyId, Pageable page);
List<Lease> findByApplicationIdAndActiveTrue(Long applicationId);
}
请注意行
Page<Lease> findByApplicationProperty_Id(Long propertyId, Pageable page);
它运行良好:)