我试图将查询限制为仅从要使用的表中选择特定列,但是当我编写一个简单的选择查询时,我最终遇到了错误
已解决[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。正如我所见,你已经拥有了。
在我看来,这是一种更优雅的方法。
| 归档时间: |
|
| 查看次数: |
13918 次 |
| 最近记录: |