空字符串时的Hibernate Select Case

时间:2013-03-07 20:54:11

标签: java hibernate string

我在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结果。

任何人都可以帮助我?

2 个答案:

答案 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()”。