【问题标题】:Spring Data JPA Page Query Wrong ResultSpring Data JPA 页面查询错误结果
【发布时间】:2020-07-04 15:21:32
【问题描述】:

我正在为分页操作创建查询。但是当我给出排序列时,答案是错误的。所有已完成的字段都成真。数据库中的已完成字段不正确。如果没有排序列,则结果正确。当您不在 Pageable 中进行排序并向查询添加顺序时,同样的问题仍然存在。

当我将 todoitem0_.item_desc as item_des4_0_ 从 询问。但我无法理解问题

当描述字段定义为 变量(255)。但我需要定义 @Lob

控制器

@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();
    }
}

休眠 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 ?

【问题讨论】:

  • @KavithakaranKanapathippillai 我试过这个。但问题仍然存在
  • Not null 成真(1)

标签: java mysql spring-boot jpa spring-data-jpa


【解决方案1】:

请注意查询中的这个“1”数字,

+ "INNER JOIN Todo t ON t.user.id = ?1 "

这弄乱了你的结果集

【讨论】:

  • 我试过这种方式 ==> “INNER JOIN Todo t ON t.user.id = :userid”。但问题仍然存在
  • 如果你留下这个 qyestion 标志并删除“1”?
猜你喜欢
  • 2020-08-13
  • 1970-01-01
  • 2021-02-13
  • 2017-12-13
  • 2018-06-04
  • 1970-01-01
  • 2019-03-01
  • 2020-06-11
  • 1970-01-01
相关资源
最近更新 更多