Java spring jpa可分页排序属性引用异常
我有一个SpringBoot项目,我使用SpringJPA。我有这个型号的Java spring jpa可分页排序属性引用异常,java,spring,hibernate,spring-mvc,spring-data-jpa,Java,Spring,Hibernate,Spring Mvc,Spring Data Jpa,我有一个SpringBoot项目,我使用SpringJPA。我有这个型号的收据,它有一列交易日期,它的数据库列名是交易日期。我正在调用findAll(谓词谓词,Pageable-Pageable)以获得所需的数据页 当我在我的ReceiptService中使用BooleanBuilder创建谓词,并使用PageRequest传递谓词而不进行排序时,它可以完全正常工作,但当我向其添加排序时,它将抛出以下异常: org.springframework.data.mapping.PropertyRef
收据
,它有一列交易日期
,它的数据库列名是交易日期
。我正在调用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或有值,因此我意识到使用谓词很容易做到这一点)
嗯,如果我理解你的问题,你想对所有数据进行排序,然后分页,对吗
您可以使用方法命名
Page<Receipt> findAllByOrderByTransactionDateDesc(Pageable pageable);
不确定这是否是正确的方法,但它现在解决了我的问题
因此,我只是将实体中的TransactionDate
更改为TransactionDate
,然后在querydsl自动生成的Q模型中也更改了相同的列(我将这些类复制粘贴到我的模型包中,以便轻松控制它们),现在如果我将排序列作为“TransactionDate”传递,它就可以正常工作
我在几天内都不会将此标记为答案,因此可能有人会想出解决此问题的正确方法,但只是为了解决可能存在相同问题的人。好吧,JPA通常(除了强制执行本机SQL命令时)希望收到java属性名,在本例中,TransactionDate,而不是真实的数据库列名transaction\u date
因此,要修复代码,基本上,您只需进行如下调用:
org.springframework.data.domain.Pageable pageable = new PageRequest(
0,
10,
Direction.DESC,
"TransactionDate");
也就是说,java命名约定规定属性和变量应该是小写的,您可以查看
我不确定JPA(在本例中是spring数据)是否也希望您遵循命名约定。因此,如果只是按照我告诉您的那样传递名称,但不起作用,您可能需要将您的实体更改为:
@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");
干杯,Nikolas如果在页面中使用字段名“TransactionDate”,会发生什么?@pDer666然后显示org.springframework.data.mapping.PropertyReferenceException:找不到类型收据的属性TransactionDate代码>保罗谢谢你的回复。我忘了提到我也在向函数传递谓词,因为我有一个动态查询。它基本上来自一个搜索框,其中可能有一些条件为null,所以我使用谓词(更新了我的问题)。我正要发布,引用必须是变量的名称,而不是列的名称。
Page page = myRepo.findAllByOrderByTransactionDateDesc(new PageRequest(page, size));
Page page = myRepo.findAllQuery(new PageRequest(page, size));
org.springframework.data.domain.Pageable pageable = new PageRequest(
0,
10,
Direction.DESC,
"TransactionDate");
@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");