java - Hibernate Projection select语句导致Internal Server Error

标签 java hibernate tomcat

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

我正在将 hibernate 查询记录到我的控制台。工作正常的 hibernate 查询只是一个传统的选择语句 (从实体 x 中选择 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'

运行选择的 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;
    }

    ....

就其值(value)而言,我可以在 Intellij 中运行 JPA-QL 查询并只返回我想要的列,但是当我这样做时它们似乎丢失了列名。

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

最佳答案

我的问题是多方面的。

首先,我没有在 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 方面缺乏经验。

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

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

public String getMesssagesPerMonth() {
    return messagesPerMonth;
}

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

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

关于java - Hibernate Projection select语句导致Internal Server Error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41883771/

相关文章:

java - 调整工具栏 SWT 大小

java - 长时间 session 中连接重置

java - 为什么不能 hibernate 懒惰地获取@ManyToOne 和@OneToOne?

java死锁降低性能

IIS -> Isapi_Redirect -> Tomcat

java - 对象引用和对象哈希码之间的区别

java - 将此 Apache Rewrite 规则转换为 tuckey URLRewriteRule

java - 使用二分查找算法作为基础来实现二分插入

java - 如何解决Hibernate-HQL中user1已经有超过 'max_user_connections'个 Activity 连接?

java - 无法通过 java 邮件 API 发送电子邮件?