【问题标题】:Hibernate Select Case when empty string空字符串时休眠选择大小写
【发布时间】:2013-04-08 02:50:42
【问题描述】:

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

来自专栏设计的一些信息: 数据类型:字符变化(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 结果缺少列描述:

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

有人可以帮帮我吗?

【问题讨论】:

  • 你使用哪个版本的 Hibernate?
  • 另外,我认为您的 JSON 编组器可能存在问题。您应该指示它也包含空值。可能您的第二个 Hibernate 查询可以正常工作,但您的 JSON 编组器不能。

标签: java hibernate string


【解决方案1】:

我会将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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 您不必映射 DTO,实际上您可以将任何类传递给 SELECT 子句,只要其构造函数适合所选值。
    猜你喜欢
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    相关资源
    最近更新 更多