0

我在 PostgreSQl 表中实现搜索时遇到问题。该表包含导致错误的空字符串值的列。

来自列设计的一些信息: 数据类型:字符变化(20) 默认值:非 NULL:否 主键:否

我的列的 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 列描述:

[[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 结果。

任何人都可以帮助我吗?

4

2 回答 2

0

您无法实例化 ClientDTO 可能是因为该类未映射到 persistence.xml。您可以将 'new ClientDTO()' 更改为 'new Client()'。

于 2013-03-07T21:58:48.553 回答
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
于 2013-03-07T21:00:57.857 回答