当我尝试在 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/