我有一个遗留表,它的列数非常多,我正试图限制hibernate填充的列数。如果我只是从"from"子句运行到最后,它可以很好地加载每一列,但当我添加"Select a.col1,a.col2…"等时,我会返回一个对象数组,而不是bean的实例。
我尝试添加一个结果转换器,但似乎认为第一列的名称是"0"。我想当结果转换器出现在画面中时,它已经坏了。我想知道是否存在大小写不匹配的情况,所以我把所有内容都改为大写,但这无济于事。
更新:这是SQL:
Select a.SZ_ABND_NO, a.ASSET_VAL, a.FO_TYP, a.ASSET_ID, a.AGCY_RGN_CD, a.LIT_AGCY_CD, a.ASSET_TYP, a.SZ_AGCY_CD, a.SUB_OFC_ID, a.OFC_ID, a.CA_ID_AGCY, a.PROC_DIST from FlatAssetT a where a.ASSET_ID in (:assetList) order by a.ASSET_ID
豆子很大。这12列是数百列中的一列(是复数)。不过,我将给出一个选定的bean片段。
@Entity
@Table(name = "FLATASSET_T", schema="K702PRDR")
public class FlatAssetT {
@Column(name="ADPT_DT", nullable=false)
private Date ADPT_DT;
@Id
@Column(name="ASSET_ID", nullable=false)
private String ASSET_ID;
@Column(name="ASSET_ID_TYP", nullable=false)
private String ASSET_ID_TYP;
@Column(name="SZ_ABND_NO", nullable=false)
private String SZ_ABND_NO;
[etc.]
public String getSZ_ABND_NO() {
return SZ_ABND_NO;
}
public void setSZ_ABND_NO(String arg) {
this.SZ_ABND_NO=arg;
}
public String getASSET_ID() {
return ASSET_ID;
}
public void setASSET_ID(String arg) {
this.ASSET_ID=arg;
}
public Date getADPT_DT() {
return ADPT_DT;
}
public void setADPT_DT(Date arg) {
this.ADPT_DT=arg;
}
public String getASSET_ID_TYP() {
return ASSET_ID_TYP;
}
public void setASSET_ID_TYP(String arg) {
this.ASSET_ID_TYP=arg;
}
[etc.]
}
您可以使用本文中的此方法进行查询
它使用Apache BeanUtils。作者将带有参数的实现作为"作业"留给了读者。
本质上,查询数据并迭代结果,从而创建bean的新实例,并将可用数据设置为该实例,从而创建带有bean的新列表。
public List find(final String hqlQuery) throws Exception {
List results = new ArrayList();
Query query = SessionManager.currentSession().createQuery(hqlQuery);
Type beanType = query.getReturnTypes()[0];
Class beanClass = beanType.getReturnedClass();
String[] columns = extractColumns(hqlQuery);
String[] attributeNames = getAttributeFieldNames(columns);
String[] resultFieldNames = getResultFieldNames(columns);
Iterator iter = query.iterate();
while(iter.hasNext()) {
Object[] row = (Object[]) iter.next();
Object bean = beanClass.newInstance();
for (int j = 0; j < row.length; j++) {
if (row[j] != null) {
initialisePath(bean, attributeNames[j]);
PropertyUtils.setProperty(bean, attributeNames[j], row[j]);
}
}
results.add(bean);
}
return results;
}
private static void initialisePath(final Object bean, final String fieldName) throws Exception {
int dot = fieldName.indexOf('.');
while (dot >= 0) {
String attributeName = fieldName.substring(0, dot);
Class attributeClass = PropertyUtils.getPropertyType(bean, attributeName);
if (PropertyUtils.getProperty(bean, attributeName) == null) {
PropertyUtils.setProperty(bean, attributeName, attributeClass.newInstance());
}
dot = fieldName.indexOf('.', dot + 1);
}
}
除了bean的默认构造函数外,还有一个自定义构造函数,它接受有限的参数集(与从DB获取的参数相匹配),然后使用"select new MyBean(..)…"语法。有关更详细的解释,请参阅下面的链接。
HQL 的新对象
此外,您还可以为所选的每一列提供别名,然后填充中所示的映射
http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html#queryhql-选择
select new map( max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n )
from Cat cat
可能是您可以向您的bean引入一个接受映射的构造函数,然后使用它(将这两种方法结合起来)