【问题标题】:spring jpa pageable sort PropertyReferenceExceptionspring jpa 可分页排序 PropertyReferenceException
【发布时间】:2017-04-19 01:06:54
【问题描述】:

我有一个 spring boot 项目,我使用 spring JPA。我有这个模型Receipt,它有一个列TransactionDate,它的数据库列名称是transaction_date。我正在调用findAll(Predicate predicate, Pageable pageable) 以获取所需的数据页面。

当我在我的 ReceiptService 中使用 BooleanBuilder 创建我的谓词并使用 PageRequest 传递它时,它工作得很好:

org.springframework.data.mapping.PropertyReferenceException: No property transaction found for type Receipt!

这就是我创建 PageRequest 的方式

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

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

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

但从异常看来,它似乎是从 _ 中删除它的

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

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;
}
}

【问题讨论】:

  • 如果您在分页中使用字段名称“TransactionDate”会发生什么?
  • @pDer666 然后它说org.springframework.data.mapping.PropertyReferenceException: No property transactionDate found for type Receipt!

标签: java spring hibernate spring-mvc spring-data-jpa


【解决方案1】:

嗯,如果我理解你的问题,你想对所有数据进行排序,然后分页,对吧?

您可以使用方法命名。

Page<Receipt> findAllByOrderByTransactionDateDesc(Pageable pageable); 

如果失败,您也可以使用查询

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

然后在您的服务上传递 Pageable 来调用它。

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

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

【讨论】:

  • 保罗感谢您的回复。我忘了提到我还向函数传递了一个谓词,因为我有一个动态查询。它基本上来自一个搜索框,它的某些条件可能为空,所以我使用谓词(更新了我的问题)
【解决方案2】:

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

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

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

【讨论】:

  • 我正要发布,引用必须是变量的名称而不是列的名称。
【解决方案3】:

嗯,一般来说,JPA(除了强制使用本机 SQL 命令时)期望接收 java 属性名称,在本例中为 TransactionDate,而不是真正的数据库列名称 transaction_date

所以要修复你的代码,基本上,你应该像这样调用:

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

话虽如此,java 命名约定规定属性和变量应采用小写驼峰式,您可以查看oracle documentation page

我不确定 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");

干杯,尼古拉斯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-28
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    • 2018-01-03
    • 2012-12-16
    相关资源
    最近更新 更多