Hibernate select子句不起作用



我有一个遗留表,它的列数非常多,我正试图限制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引入一个接受映射的构造函数,然后使用它(将这两种方法结合起来)

最新更新