Hibernate 休眠选择子句不工作

Hibernate 休眠选择子句不工作,hibernate,Hibernate,我有一个旧表,它的列数非常多,我正试图限制hibernate填充的列数。如果我只是从“from”子句一直运行到最后,它工作得很好,加载每一列,但是当我添加“Select a.col1,a.col2…”等时,我会返回一个对象数组,而不是bean的实例 我尝试添加一个结果转换器,但它似乎认为第一列名为“0”。我想当结果转换器出现在图片中时,它已经坏了。我想知道是否有大小写不匹配的问题,所以我把所有内容都改为大写,但这没有帮助 更新: 下面是SQL: Select a.SZ_ABND_NO, a.AS

我有一个旧表,它的列数非常多,我正试图限制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.]
}

除了bean的默认构造函数之外,还有一个自定义构造函数,它接受有限的参数集(与从DB获取的参数匹配),然后使用“selectnewmybean(..)”语法。有关更详细的说明,请参阅下面的链接

此外,您还可以为正在选择的每个列指定别名,然后填充地图,如中所示


可能您可以向bean引入一个构造函数来接受一个映射,然后使用它(将这两种方法结合起来)

您可以从下面的

它使用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);
            }
    }
公共列表查找(最终字符串hqlQuery)引发异常{
列表结果=新建ArrayList();
Query Query=SessionManager.currentSession().createQuery(hqlQuery);
类型beanType=query.getReturnTypes()[0];
类beanClass=beanType.getReturnedClass();
String[]columns=extractColumns(hqlQuery);
字符串[]attributeNames=getAttributeFieldNames(列);
字符串[]resultFieldNames=getResultFieldNames(列);
迭代器iter=query.iterate();
while(iter.hasNext()){
对象[]行=(对象[])iter.next();
objectbean=beanClass.newInstance();
对于(int j=0;j=0){
字符串attributeName=fieldName.substring(0,点);
类attributeClass=PropertyUtils.getPropertyType(bean,attributeName);
if(PropertyUtils.getProperty(bean,attributeName)==null){
setProperty(bean、attributeName、attributeClass.newInstance());
}
点=字段名.indexOf('.',点+1);
}
}

您能帮助我们发布您试图选择的bean吗?可能是当前表的SQL创建?另外,不要忘了提及如果您使用的是纯JPA或HibernateAPI,是HQL还是JPQL?使用hibernate标准API?它帮助我们尝试并调试这个问题:)@André-使用HQL。该表不是由hibernate创建的。这是一个遗留表。使用用户输入的字符串键(asset_id)非常简单。我对CriteriaAPI一无所知,只知道它存在。我听说“投影”在这里很有用,但我不知道怎么做。听起来很不错!但不幸的是,我希望部分选择是动态的。一个dao方法,它获取要返回的列列表。这部分是因为这是web服务的一部分,我打算接受他们想要返回的信息列表。我忘了在前面的评论中添加at,所以我添加第二个,只是希望它能通知您。
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);
            }
    }