我的应用程序正在使用hibernate+sybase。在执行查询时,我得到以下错误

Caused by: java.sql.SQLException: The identifier that starts with 'decision_engine_timestamp16_10' is too long. Maximum length is 30.

表中有一个名为decision_engine_timestamp的列,它小于30。但是为什么hibernate会在定义的列名后面附加16_10呢?甚至决策引擎的时间戳16是30。
我无法更改表列名。我使用typedquery而不是特定的查询来搜索表。错误发生在下面指定的行上:
public static final <S extends Serializable, M> PageResult<M> findByPage(EntityManager em,
                                                                         WhereBuilder<S, M> whereBuilder, S searchCriteria, Class<M> modelClass, PageRequest pageRequest) {
    CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();

    CriteriaQuery<M> contentCriteriaQuery = criteriaBuilder.createQuery(modelClass);
    Root<M> contentRoot = contentCriteriaQuery.from(modelClass);
    contentCriteriaQuery.select(contentRoot);

    if (searchCriteria != null) {
        contentCriteriaQuery.where(whereBuilder.build(searchCriteria, criteriaBuilder, contentRoot));
        if (pageRequest != null && pageRequest.getOrders() != null) {
            contentCriteriaQuery.orderBy(QueryUtils.toOrders(pageRequest.getSort(), contentRoot, criteriaBuilder));
        }
    }
    TypedQuery<M> contentQuery = em.createQuery(contentCriteriaQuery);

    if (pageRequest != null) {
        CriteriaQuery<Long> totalCriteriaQuery = criteriaBuilder.createQuery(Long.class);
        Root<M> totalRoot = totalCriteriaQuery.from(modelClass);
        totalCriteriaQuery.select(criteriaBuilder.count(totalRoot));
        if (searchCriteria != null) {
            totalCriteriaQuery.where(whereBuilder.build(searchCriteria, criteriaBuilder, totalRoot));
        }
        TypedQuery<Long> totalQuery = em.createQuery(totalCriteriaQuery);
        contentQuery.setFirstResult(pageRequest.getOffset());
        contentQuery.setMaxResults(pageRequest.getPageSize());

        List<M> resultList = contentQuery.getResultList();//--error occurs here
        if (resultList == null) {
            resultList = new ArrayList<M>();
        }
        int total = totalQuery.getSingleResult().intValue();
        return new PageResult<M>(resultList, pageRequest, total);
    } else {
        List<M> resultList = contentQuery.getResultList();
        if (resultList == null) {
            resultList = new ArrayList<M>();
        }
        return new PageResult<M>(resultList);
    }
}

选择LocaterEQU0.ID为ID1_10_10_10_10_10_10_10_10_10_10_10_10_10_10_3_10_10_10_3_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10定位资产国为资产国资产名称为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全名为资产的全定位引擎结果为决策引擎,决策引擎,决策引擎,决策引擎,决策引擎,决策引擎,决策引擎,决策引擎,决策引擎,决策引擎,决策引擎,决策引擎,决策引擎,决策引擎,决策引擎,决策引擎,决策引擎,决策引擎,决策引擎,决策引擎,决策引擎,决策引擎,决策引擎,决策引擎,决策引擎,决策引擎,决策引擎,决策引擎,决策引擎,决策引擎,决策引擎,决策引擎,决策引擎locaterEQU0。final_decision_source作为final_decision_source21_10_u,locaterEQU0_u。final_decision_timestamp作为final_decision_22_10_u,locaterEQU0。final_decision_user作为final_decision_23_10_u,locaterEQU0。locaterEQU0 type作为locate_24_10_10_4,locaterEQU0是long_10_4,locaterEQU0是long_10_4,locaterEQUO是long_10_4,locaterEQUO是long叙述性叙述26_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_10_0.叙述性叙述性叙述性叙述性叙述性叙述性叙述性叙述性叙述性叙述性叙述性叙述性叙述性叙述性叙述性叙述性叙述性叙述性叙述性叙述性叙述性叙述U组按要求_组32_10_,请求数量:请求数量:数量33\u10,locateterequa0。请求数量:请求数量:数量33\u10,locateterequa0。请求数量:请求数量:票证数量:请求数量34\u10,locateterequa0。请求数量:请求数量:请求数量,请求数量:票证数量:请求数量34\u10,locateterequa0,请求数量:请求数量,locateterequa0,请求数量:请求数量,请求数量数量:数量33\u10,locateterequa0,请求数量,请求数量:时间戳37\u10,locateterequa0,ric38\u10,locateterequa0,ric38\u10,10,locateterequar,10,locateterequar,10,locateterequar,10,locateterequa u,安全性是指安全性。安全性是指安全性是指安全性是指id39 U 10_u,locateterequa0_0.sedol是指sedol40_10_10_10_10_10.locateterequa0_10_10_10_10_0.source,locateterequa0_10_4_10_10_4,locateterequa0_10_10_0.source,locateterequa0_10_0.security_0.security_ID是安全性是指id39_10_10_10_10_10_10_10_10_10_10_10_10_10股票45_10_,locaterEQU0。used_quantity as used_quantity 46_10_U,locaterEQU0_U。valid_till_U timestamp as valid_till_U timestamp 47_10_U from gsf_U locate_request locaterEQU0_U where(locaterEQU0_U.final_U decision is null)and(locaterEQU0_U.request_U group in(?),?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?))按位置ID ASC排序

最佳答案

在Oracle中,任何数据库对象名(如表、列、别名)的长度都必须小于AA>。at most 30 bytes也是。
hibernate必须对列名使用唯一别名,因为查询可能使用自联接,然后select子句将要选择的列将不明确。
列别名由不可配置的Sybase has the same limitation生成,因此需要使用较短的列名。确保列名最长不超过24个字符,因为hibernate将添加计数器后缀以确保唯一性(例如35_10_)。

10-06 16:03