Hibernate Projection select语句导致内部服务器错误

时间:2017-01-26 22:02:22

标签: java hibernate tomcat

当我尝试在Hibernate中运行指定的select语句时,我遇到了内部服务器错误(没有写入Tomcat日志,而不是500错误)。在运行传统的简单select语句时,我没有任何问题。

我正在将hibernate查询记录到我的控制台。可以正常工作的hibernate查询只是一个传统的select语句 (select x from Entity x):

Hibernate: 
    select
        trumpialis0_.TLDLID as TLDLID1_0_,
        trumpialis0_.TLDLDNM as TLDLDNM2_0_,
        trumpialis0_.TLDLMSG as TLDLMSG3_0_,
        trumpialis0_.TLDLNAM as TLDLNAM4_0_,
        trumpialis0_.TLDLDAB as TLDLDAB5_0_,
        trumpialis0_.TLDLSTS as TLDLSTS6_0_ 
    from
        LIBRARY.TABLE trumpialis0_ 
    where
        trumpialis0_.TLDLSTS='W'

运行select x.property... from Entity x

时的hibernate查询
   Hibernate: 
        select
            trumpialis0_.TLDLDNM as col_0_0_ 
        from
            LIBRARY.TABLE trumpialis0_ 
        where
            trumpialis0_.TLDLSTS='W'

运行select的Java是:rows = em.createQuery("select x.displayName from X where x.webStatus = 'W'").getResultList();

我的实体看起来像这样:

@Entity
@Table(name = "TABLE", schema = "LIBRARY")
@XmlRootElement
public class X {
    private String id;
    private String name;
    private String displayName;
    private String webStatus;
    private String messagesPerMonth;

    @Id
    @Column(name = "TLDLID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    ....

对于它的价值,我可以在Intellij中运行JPA-QL查询并返回我想要的列,但是当我这样做时它们似乎丢失了它们的列名。

有没有办法可以选择某些属性?我不需要返回所有内容,并且真的不想转换为“返回对象”或类似的东西。

1 个答案:

答案 0 :(得分:0)

我的问题是多方面的。

首先,我没有在select语句中使用正确的语法。我真正需要做的是从现有结果中创建一个新实体。我终于恍然大悟谷歌,并意识到踩过调试器;我的代码没有失败,直到 AFTER 我想对结果做一些事情,而不是结果本身。

rows = em.createQuery("select NEW com.example.entities.Entity(list.id, list.name, list.displayName, list.messsagesPerMonth) from Entity list where list.webStatus = 'W'").getResultList();

现在,为了使这项工作正常,Intellij足够聪明地警告我实体中no这样的构造函数exists,所以我不得不根据这些值创建一个构造函数,并将其添加到我的其他生成的实体代码中。

最后,在没有任何有用的调试的情况下轰炸Hibernate的代码完全是我对OO的缺乏经验。

虽然允许将null值设置为Entity属性,但是当您处理基于其整个长度返回字符串的遗留数据库时,您急于整理实体内部的这些字符串,因为它们从DB返回后包含许多空格。

不幸的是,我这样做的方式只是property.trim() et的return语句中的一个简单的getName()。人。方法

public String getMesssagesPerMonth() {
    return messagesPerMonth;
}

我需要的是更强大的功能,并进行错误检查,以便在属性设置为trim()时不会尝试null null值。

public String getMesssagesPerMonth() {
    if (messagesPerMonth != null) {
        return messagesPerMonth.trim();
    } else {
        return messagesPerMonth;
    }
}