无法从类型 [java.lang.Object[]] 转换为类型 [@org.springframework.data.jpa.repository.Query com.data.models.Users]

Rem*_*emy 3 java spring-boot

我试图将查询限制为仅从要使用的表中选择特定列,但是当我编写一个简单的选择查询时,我最终遇到了错误

已解决[org.springframework.core.convert.ConversionFailedException:无法从类型[java.lang.Object[]]转换为类型[@org.springframework.data.jpa.repository.Query com.aims.covidsurvey.models.Users ] 对于值“{44,test@gmail.com,约翰,史密斯}”;嵌套异常是 org.springframework.core.convert

当我选择全部时,没有错误,但它选择了一些大列,这些列需要很长时间才能执行查询。

这就是我到目前为止所做的

我的存储库

public interface ProductRepository extends JpaRepository<Users, Long> {
    
    @Query("SELECT p FROM Users p WHERE CONCAT(p.id, ' ', p.email, ' ', p.firstname, ' ', p.surname) LIKE %?1%")
     List<Users> search(String keyword);

    @Query("SELECT e.id, e.email, e.firstname, e.surname FROM Users e")
     List<Users> findByQuery();
}
Run Code Online (Sandbox Code Playgroud)

我的服务

@Service
public class ProductService {
    @Autowired
    private ProductRepository repo;



    public List<Users> listAll(String keyword) {
        if (keyword != null) {
            return repo.search(keyword);
        }
        return repo.findByQuery();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的模特班

@Entity
@Table(name = "users")
public class Users {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotBlank
    @Size(max = 100)
    private String username;

    @NotBlank
    @Size(max = 100)
    @Email
    private String email;

    @NotBlank
    @Size(max = 120)
    private String password;

    private String surname;
    private String firstname;
    @Lob
    private byte[] data;
    private Date datecreated;
    private String date_of_birth;
    @Size(max = 10)
    private String gender;
    @Size(max = 30)
    private String national_id;
    @Size(max = 120)
    private String study_role;
    @Size(max = 20)
    private String assigned_team;
    private Integer active;
    private Date  activation_date;
    private String trainingvenue;
    private String staffid;
    private String trainingclass;
    private String country;
    private String resetPasswordToken;
    private Integer deleted;

    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    private String userid;

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "user_roles",
            joinColumns = @JoinColumn(name = "user_id"),
            inverseJoinColumns = @JoinColumn(name = "role_id"))
    private Set<Role> roles = new HashSet<>();

    public Users() {
    }

    public Users(Long id, String email, String firstname, String surname) {
        this.id = id;
        this.email = email;
        this.surname = surname;
        this.firstname = firstname;

    }
Run Code Online (Sandbox Code Playgroud)

我的控制器

@RequestMapping("/")
public String viewHomePage(Model model, @Param("keyword") String keyword) {
   // List<Users> listProducts = service.listAll(keyword);
    List<Users> listProducts = service.listAll(keyword);

    model.addAttribute("listProducts", listProducts);
    model.addAttribute("keyword", keyword);

    return "index";
}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

先感谢您。

Tri*_*oan 14

问题出在您的存储库中。当您只选择某些列时,Spring Boot 无法将它们转换为您的Users对象。

有两种方法可以解决此问题:

1. 将返回类型更改为List<Object[]>

@Query("SELECT e.id, e.email, e.firstname, e.surname FROM Users e")
List<Object[]> findByQuery();
Run Code Online (Sandbox Code Playgroud)

然后,您必须自己进行映射。

2.更改查询

@Query("SELECT new Users(e.id, e.email, e.firstname, e.surname) FROM Users e")
List<Users> findByQuery();
Run Code Online (Sandbox Code Playgroud)

只需确保模型中有适当的构造函数即可Users。正如我所见,你已经拥有了。

在我看来,这是一种更优雅的方法。