我在PostgreSQl表中实现搜索时遇到问题。该表包含具有空strng值的列,这些列会导致错误。
列设计中的一些信息: 数据类型:变化的字符(20) 默认: 不是空:不 主键:否
我的列的java类注释:
@Column(name = "codeClient")
private String codeClient;
此查询字符串在没有“空字符串”值时起作用:
SELECT c FROM Client c WHERE c.id = 765432
我的Json回来了:
[{"id":765432,"nameClient":"JACK SMITH","codeClient":"234567890"}]
当我更改查询以处理空值时:
SELECT c.id, c.nameClient, CASE c.codeClient WHEN '' THEN 'nonexistent' else c.codeClient END FROM Client c WHERE c.id = 765432
查询有效,但Json结果错过了de columns描述:
[[765432,"JACK SMITH","234567890"]]
要解决此问题,我更改查询以返回对象:
SELECT new ClientDTO(c.id, c.nameClient, CASE c.codeClient WHEN '' THEN 'nonexistent' else c.codeCliente END) FROM Client c WHERE c.id = 765432
但是当结果为空字符串时,Hibernate无法解决:
Java.lang.IllegalArgumentException: org.hibernate.QueryException: could not instatiate class [ClientDTO] from tuple
我尝试过使用JPA CriteriaBuilder。它适用于简单的查询,但由于复杂性,我无法实现我需要的查询。
我无法改变数据库设计,我需要Json结果。
任何人都可以帮助我?
答案 0 :(得分:0)
我会将CASE c.codeClient WHEN '' THEN 'nonexistent' else c.codeCliente END
逻辑放在DTO中:
public ClientDTO(){
...
this.codeClient = ("".equals(codeClient)) ? "nonexistent" : c.codeClient;
...
}
并让查询尽可能简单:
SELECT new ClientDTO(c.id, c.nameClient, c.codeClient) FROM Client c WHERE c.id = 765432
答案 1 :(得分:0)
您无法实例化ClientDTO,因为该类未在persistence.xml中映射。您可以将“new ClientDTO()”更改为“new Client()”。