![](/img/trans.png)
[英]Spring JPA Hibernate uses old @Column names in Pageable requests: PropertyReferenceException
[英]spring jpa pageable sort PropertyReferenceException
我有一个 spring boot 项目,我使用 spring JPA。 我有这个模型Receipt
有一个列TransactionDate
,它的数据库列名称是transaction_date
。 我正在调用findAll(Predicate predicate, Pageable pageable)
来获取所需的数据页。
当我在我的BooleanBuilder
中使用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");
这就是我在调试模式下查看我的 pageable 时的样子
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;
}
}
好吧,JPA 通常(除了当您强制使用本机 SQL 命令时),期望接收 java 属性名称,在本例中为TransactionDate ,而不是实际数据库列名称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<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));
不确定这是否是正确的方法,但它现在解决了我的问题。
因此,我只是将实体中的TransactionDate
更改为transactionDate
,然后也更改了 querydsl 自动生成的 Q 模型中的同一列(我将这些类复制粘贴到我的模型包中,以便我可以轻松控制它们),现在它可以正常工作,如果我将排序列作为“transactionDate”传递。
我不会在几天内将此标记为答案,所以也许有人会想出解决此问题的正确方法,但只是为了可能遇到相同问题的人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.