【问题标题】:Hibernate Projection select statement causes Internal Server ErrorHibernate Projection select 语句导致内部服务器错误
【发布时间】:2017-06-12 12:47:20
【问题描述】:

当我尝试在 Hibernate 中运行指定的 select 语句时,我遇到了内部服务器错误(没有写入 Tomcat 日志,除了 500 错误)。运行传统的简单 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: 
        select
            trumpialis0_.TLDLDNM as col_0_0_ 
        from
            LIBRARY.TABLE trumpialis0_ 
        where
            trumpialis0_.TLDLSTS='W'

运行选择的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 查询并只取回我想要的列,但是当我这样做时它们似乎丢失了列名。

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

【问题讨论】:

  • 那么,如果您只是除以零,您是否会在日志中看到任何有用的信息,或者您是否也只是收到一个没有任何解释的普通 500?
  • 我应该在哪里尝试除以 0?
  • 在任何你确定它会被执行的地方。可能就在“运行选择的 Java”之前。
  • 是的,它会抱怨。我可以做其他错误的事情,这对解决问题会更有帮助。
  • 哇。那我不知道有什么问题。让我们看看其他人是否有任何线索。

标签: java hibernate tomcat


【解决方案1】:

我的问题是多维的。

首先,我并没有在我的 select 语句中使用正确的语法。我真正需要做的是根据现有实体的结果创建一个新实体。我终于在 Google 上明白了这一点,并意识到单步调试器;我的代码直到 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 的缺乏经验。

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

不幸的是,我这样做的方式只是在getName() 等的返回语句上的一个简单的property.trim()。人。方法。

public String getMesssagesPerMonth() {
    return messagesPerMonth;
}

我需要的是更健壮的东西,带有错误检查功能,这样如果属性设置为null,它就不会尝试trim() null 值。

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

【讨论】:

    猜你喜欢
    • 2014-11-26
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 2013-08-11
    • 2012-03-29
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多