簡體   English   中英

Spring 數據 JPA 頁面查詢錯誤結果

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM