【问题标题】:Failed to convert from type [java.lang.Object[]] to type [@org.springframework.data.jpa.repository.Query com.data.models.Users]无法从类型 [java.lang.Object[]] 转换为类型 [@org.springframework.data.jpa.repository.Query com.data.models.Users]
【发布时间】:2021-05-12 08:47:05
【问题描述】:

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

已解决 [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();
}

我的服务

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



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

我的模型课

@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;

    }

我的控制器

@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";
}

我做错了什么?

提前谢谢你。

【问题讨论】:

  • 所有用户都是对象,但并非所有对象都是用户,这是您的主要问题。
  • HI @Stultuske 是存储库的问题吗?

标签: java spring-boot


【解决方案1】:

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

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

1.将返回类型更改为List&lt;Object[]&gt;

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

然后,你必须自己做映射。

2。更改查询

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

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

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

【讨论】:

    猜你喜欢
    • 2020-03-29
    • 2017-07-15
    • 2020-04-23
    • 2018-08-04
    • 1970-01-01
    • 2021-09-22
    • 2014-05-19
    • 2016-10-17
    • 1970-01-01
    相关资源
    最近更新 更多