[英]Spring Data JPA Page Query Wrong Result
我正在為分頁操作創建查詢。 但是當我給出排序列時,答案是錯誤的。 所有已完成的字段都成真。 數據庫中的已完成字段不正確。 如果沒有排序列,則結果是正確的。 當您不在 Pageable 中進行排序並向查詢添加順序時,同樣的問題仍然存在。
當我從查詢中刪除todoitem0_.item_desc 作為 item_des4_0_時,它會起作用。 但我無法理解問題
當描述字段定義為 varchar(255) 時,問題已得到解決。 但我需要定義@Lob
Controller
@RestController
@CrossOrigin
@RequestMapping("/api/item")
public class TodoItemController {
@GetMapping(value = "/list")
private TodoItemDto getUserItems(Authentication authentication,
@RequestParam("page") int page, @RequestParam("sizePerPage") int sizePerPage){
Pageable pageable = PageRequest.of(page,sizePerPage, Sort.by("createdAt").descending());
return todoItemService.getUserItems(((CustomUserDetails) authentication.getPrincipal()).getId(),pageable);
}
}
服務
@Service
@Transactional
public class TodoItemServiceImpl implements TodoItemService {
@Override
public TodoItemDto getUserItems(long userId, Pageable pageable){
Page<TodoItem> itemPage = todoItemRepository.findUserItems(userId, pageable);
TodoItemDto dto = new TodoItemDto();
dto.setContent(itemPage.getContent());
dto.setTotal((int)itemPage.getTotalElements());
return dto;
}
}
存儲庫
public interface TodoItemRepository extends JpaRepository<TodoItem, Integer> {
@Query(value = "SELECT i FROM TodoItem i "
+ "INNER JOIN Todo t ON t.user.id = ?1 "
+ "WHERE i.todo.id = t.id ")
Page<TodoItem> findUserItems(long userId, Pageable pageable);
}
實體
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "items")
public class TodoItem{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@NotBlank(message = "Item name not be blank")
@Column(nullable = false, unique = true)
private String itemName;
@NotBlank(message = "Item description not be blank")
@Lob
private String itemDesc;
@ManyToOne
@JoinColumn(name = "todoId")
private Todo todo;
@Column(nullable = false)
private boolean completed = false;
@Temporal(TemporalType.TIMESTAMP)
@Column(nullable=false, updatable = false)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd / MM / yyyy")
private Date createdAt;
@PrePersist
protected void onCrearedAt() {
this.createdAt = new Date();
}
}
Hibernate Sql 查詢
select
todoitem0_.id as id1_0_,
todoitem0_.completed as complete2_0_,
todoitem0_.created_at as created_3_0_,
todoitem0_.item_desc as item_des4_0_,
todoitem0_.item_name as item_nam5_0_,
todoitem0_.todo_id as todo_id6_0_
from
items todoitem0_
inner join
todo todo1_
on (
todo1_.user_id=?
)
where
todoitem0_.todo_id=todo1_.id
order by
todoitem0_.created_at desc limit ?
請注意查詢中的這個“1”數字,
+ "INNER JOIN Todo t ON t.user.id = ?1 "
這弄亂了您的結果集
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.