我有一个名为'ImportReceiptRepository'的Spring CrudRepository。
我只是想编写一个方法来抓取order by子句中的第一行。
以下是我目前正在使用的内容:
ImportReceipt importReceipt = this.importReceiptRepository.getOneByImportTypeOrderByTimestampDesc(importType);
问题是当返回多行时,Spring会抛出:
org.springframework.dao.IncorrectResultSizeDataAccessException: result returns more than one elements; nested exception is javax.persistence.NonUniqueResultException: result returns more than one elements
如果返回0-n行,我应该如何重命名这个CrudRepository函数来抓取第一行?
答案 0 :(得分:2)
简单地使用Pageable是关键:
List<ImportReceipt> findByImportType(String importType, Pageable pageable);
并将其称为:
List<ImportReceipt> importReceipts = this.importReceiptRepository.findByImportType(importType, new PageRequest(0, 1, Direction.DESC, "Timestamp"));
ImportReceipt importReceipt = importReceipts.get(0);
信用:How to combine pagination with a criteria query in Spring Data JPA?
答案 1 :(得分:1)
从即将发布的Spring Data JPA 1.7版本开始,您最初声明的查询方法开箱即用。有关详细信息,请参阅this ticket。该支持已在该版本的第一个里程碑中发布。
答案 2 :(得分:0)
您可以通过findFirst使其更简单:
input_hashtag_advance.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_ENTER: {
LayoutInflater inflater = LayoutInflater.from(getActivity());
Chip chip_item = (Chip) inflater.inflate(R.layout.layout_chip, null, false);
ChipGroup chip_hashtag = view.findViewById(R.id.chip_hashtag);
chip_item.setText(input_hashtag_advance.getText().toString());
input_hashtag_advance.setText(null);
chip_item.setOnCloseIconClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
chip_hashtag.removeView(v);
}
});
chip_hashtag.addView(chip_item);
}
return true;
default:
break;
}
}
return false;
}
});
有关更多信息:Limiting Query Results