当我尝试在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:
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查询并返回我想要的列,但是当我这样做时它们似乎丢失了它们的列名。
有没有办法可以选择某些属性?我不需要返回所有内容,并且真的不想转换为“返回对象”或类似的东西。
答案 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;
}
}