当前位置: 首页 > 知识库问答 >
问题:

spring jpa可分页排序属性引用异常

滑景胜
2023-03-14

我有一个spring boot项目,我使用spring JPA。我有一个收据模型,它有一个列TransactionDate,它的数据库列名是transaction_date。我调用<code>findAll(谓词谓词,Pageable-Pageable)

当我在ReceiptService中使用BooleanBuilder创建谓词并使用PageRequest传递它时,它完全正常工作,但当我添加排序时,它会抛出以下异常:

org.springframework.data.mapping。PropertyReferenceException:找不到类型收据的属性交易记录

这就是我如何创建我的页面请求

org.springframework.data.domain.Pageable pageable = new PageRequest(
        0, 
        10,
        Direction.DESC,
        "transaction_date");

这就是我在调试模式下查看页面时的样子

Page request [number: 0, size 10, sort: transaction_date: DESC]

但是,从例外情况来看,它似乎是在把它从_

这是我的存储库函数:(由于条件来自搜索框,该搜索框可能具有其他一些字段null或具有值,我意识到使用谓词很容易做到这一点)

public Page<Receipt> findAll(Predicate predicate, org.springframework.data.domain.Pageable pageable);

这是收据实体

@Entity
public class Receipt extends Base {

@Column(name="email")
private String Email;

@Column(name="bsid")
private String Bsid;


@Column(name="snap_shot")
private String SnapShot;

@Column(name="transaction_date")
private Date TransactionDate;

@Column(name="reference_number")
private String ReferenceNumber;

@Column(name="total_amount")
private Double TotalAmount;

@Column(name="submitted_by_user")
private boolean SubmittedByUser;

@Column(name="approval_date")
private Date ApprovalDate;

@ManyToOne
@JoinColumn(name="user_id")
private User User;

@ManyToOne
@JoinColumn(name="store_id")
private Store Store;

@Column(name="pending")
private boolean Pending;

@Column(name="declined")
private boolean Declined;

@Column(name="approved")
private boolean Approved;

public String getEmail() {
    return Email;
}

public void setEmail(String email) {
    Email = email.trim();
}

public String getBsid() {
    return Bsid;
}

public void setBsid(String bsid) {
    Bsid = bsid.trim();
}

public String getSnapShot() {
    return SnapShot;
}

public void setSnapShot(String snapShot) {
    SnapShot = snapShot.trim();
}

public Store getStore() {
    return Store;
}

public void setStore(Store store) {
    Store = store;
}

public Date getTransactionDate() {
    return TransactionDate;
}

public void setTransactionDate(Date transactionDate) {
    TransactionDate = transactionDate;
}

public String getReferenceNumber() {
    return ReferenceNumber;
}

public void setReferenceNumber(String referenceNumber) {
    ReferenceNumber = referenceNumber.trim();
}

public Double getTotalAmount() {
    return TotalAmount;
}

public void setTotalAmount(Double totalAmount) {
    TotalAmount = totalAmount;
}

public boolean isSubmittedByUser() {
    return SubmittedByUser;
}

public void setSubmittedByUser(boolean submittedByUser) {
    SubmittedByUser = submittedByUser;
}

public User getUser() {
    return User;
}

public void setUser(User user) {
    User = user;
}

public boolean isPending() {
    return Pending;
}

public void setPending(boolean pending) {
    Pending = pending;
}

public boolean isDeclined() {
    return Declined;
}

public void setDeclined(boolean declined) {
    Declined = declined;
}

public boolean isApproved() {
    return Approved;
}

public void setApproved(boolean approved) {
    Approved = approved;
}

public Date getApprovalDate() {
    return ApprovalDate;
}

public void setApprovalDate(Date approvalDate) {
    ApprovalDate = approvalDate;
}
}

共有3个答案

魏健柏
2023-03-14

不确定这是否是正确的方法,但现在它解决了我的问题。

因此,我只是将实体中的 TransactionDate 更改为 transactionDate,然后在 querydsl 自动生成的 Q 模型中也更改了同一列(我将这些类复制到我的模型包中,以便我可以轻松控制它们),现在如果我将排序列作为“transactionDate”传递,它就可以正常工作。

我不会在几天内将此标记为答案,所以也许有人会想出正确的方法来解决此问题,但这只是为了可能有相同问题的人。

薛坚
2023-03-14

嗯,如果我没理解错你的问题,你想把所有的数据分类,然后分页,对吗?

您可以使用方法命名。

Page<Receipt> findAllByOrderByTransactionDateDesc(Pageable pageable); 

如果失败,还可以使用查询

@Query("SELECT r FROM Receipt r ORDER BY  r.transaction_date DESC")
Page<Receipt> findAllQuery(Pageable pageable);

然后在您的服务上,您传递可寻呼以调用它。

Page page = myRepo.findAllByOrderByTransactionDateDesc(new PageRequest(page, size));

Page page = myRepo.findAllQuery(new PageRequest(page, size));
钱毅
2023-03-14

好吧,JPA通常(除了强制使用本机SQL命令时)期望接收java属性名称,在本例中为TransmissionDate,而不是transaction_date的真实数据库列名称。

因此,要修复代码,基本上,您只需进行如下调用

org.springframework.data.domain.Pageable pageable = new PageRequest(
    0, 
    10,
    Direction.DESC,
    "TransactionDate");

话虽如此,java命名约定说属性和变量应该采用较低的驼峰大小写,因为您可以查看oracle文档页面。

我不确定JPA(在这里是spring-data)是否也希望您遵循命名约定。因此,如果仅仅按照我告诉你的那样传递名称还没有奏效,你可能需要把你的实体改成这样:

@Entity
public class Receipt extends Base {

    @Column(name="email")
    private String email;

    @Column(name="bsid")
    private String bsid;


    @Column(name="snap_shot")
    private String snapShot;

    @Column(name="transaction_date")
    private Date transactionDate;

    @Column(name="reference_number")
    private String referenceNumber;

    @Column(name="total_amount")
    private Double totalAmount;

    @Column(name="submitted_by_user")
    private boolean submittedByUser;

    @Column(name="approval_date")
    private Date approvalDate;

    @ManyToOne
    @JoinColumn(name="user_id")
    private User user;

    @ManyToOne
    @JoinColumn(name="store_id")
    private Store store;

    @Column(name="pending")
    private boolean pending;

    @Column(name="declined")
    private boolean declined;

    @Column(name="approved")
    private boolean approved;

    // getters, setters, equals, hashcode, tostring, ...
}

然后,你的电话应该是这样的:

org.springframework.data.domain.Pageable pageable = new PageRequest(
    0, 
    10,
    Direction.DESC,
    "transactionDate");

干杯,尼古拉

 类似资料:
  • 我想在我的文档中添加分页链接。 是保存内容和可分页对象的Page对象。 问题是。它创建“sort=title:asc”。但我需要“sort=title,asc”的格式,如Spring数据文档本章所述。我假设有比自己构建所需字符串更好的方法。我认为这是一个普遍的问题。 创建可用的排序参数字符串的最佳方法是什么? 我不需要像这里所示的静态行为 Spring5 百里香3

  • 我试图指定一个用注释的存储库方法和一个带有对象的Pagable: 编辑1:此存储库正在扩展分页和排序存储库。 对象使用以下方法签名指定: 但生成的输出查询没有排序选项,例如: ...在我期待的时候: 这里有人遇到过这样的问题吗?我使用的是Spring Boot 1.5。x。

  • (我用的是Micronaut)我有一个学生名单,我想按名字排序。我正在使用Pageable和sort作为查询参数 萨曼莎 蒂姆 安东尼奥 大卫 索菲亚 而不是: 安东尼奥 大卫 萨曼莎 索菲亚 蒂姆 会有什么问题?

  • 问题内容: 我正在尝试按属性对一些数据进行排序。这是我tought应该可以工作的示例,但事实并非如此。 HTML部分: JS部分: 结果: A-> AData B-> BData C-> C数据 …恕我直言,应如下所示: C-> C数据 B-> BData A-> AData 我是否错过了某些东西(可以在这里进行JSFiddle的实验)? 问题答案: AngularJS的orderBy过滤器仅支持

  • 我有一个本地工作正常的项目,但当我将war部署到服务器并尝试执行Rest方法时,我得到: 我知道它与重叠的罐子有关,但找不到解决方案。当我使用JHades时,我会收到与Json或Jackson相关的消息: Pom。与Json或Jackson相关的xml片段: 我试图移除或更换罐子,但没有效果。如何解决这个问题?