JPA + DB2 не может выполнить простой запрос

Edit1: когда Hibernate подключается к MS-SQL, сканируются все столбцы и таблицы. Журналы

Но когда Hibernate подключается к DB2, он пытается снова разобрать (рендерить) все таблицы и столбцы, которые содержат букву «i». Журналы

После того, как я просмотрел таблицы и столбцы, я понял, что все буквы большие. Фактически, в DB2 каждая буква была большой. Hibernate использует строчные буквы для запроса, и из-за чувствительности DB2 к большим буквам он не понимает имена столбцов. По этой причине он подает сигнал тревоги, который находится ниже,

WARN SqlExceptionHelper: SQL Error: -99999, SQLState: 42703 
15:15:22,025 ERROR SqlExceptionHelper: An undefined column name was detected.

Как я могу решить эту проблему?


Мне нужно получить данные из таблицы в db2 с помощью jpa. Когда я пытаюсь выполнить запрос с помощью диспетчера сущностей, я получаю ошибки, не зная, в чем именно проблема. Мой код работает на MS-SQL и HSQL-DB... Но я подключаю DB2 с сообщением об ошибке: *

  • Запрос qry = em.createQuery("из холдинга h, где h.RDeleted=:arg1");-

    13:26:38,135 ОТЛАДКА SQL: выберите холдинг0_.HoldingId как HoldingId1_, холдинг0_.RDeleted как RDeleted1_, холдинг0_.InsertDate как InsertDate1_, холдинг0_.SavesUserId как SavesUse4

    WARN SqlExceptionHelper: SQL Error: -99999, SQLState: 42703 
    15:15:22,025 ERROR SqlExceptionHelper: An undefined column name was detected.
    
    , холдинг0_.UpdateDate как UpdateDate1_, холдинг0_.Updater как Updater1_, холдинг0_.Description как Descript7
    WARN SqlExceptionHelper: SQL Error: -99999, SQLState: 42703 
    15:15:22,025 ERROR SqlExceptionHelper: An undefined column name was detected.
    
    , Holding0_.HoldingName как HoldingN8
    WARN SqlExceptionHelper: SQL Error: -99999, SQLState: 42703 
    15:15:22,025 ERROR SqlExceptionHelper: An undefined column name was detected.
    
    из Holding Holding0_, где Holding0_.RDeleted=? Hibernate: выберите холдинг0_.HoldingId как HoldingId1_, холдинг0_.RDeleted как RDeleted1_, холдинг0_.InsertDate как InsertDate1_, холдинг0_.SavesUserId как SavesUse4
    WARN SqlExceptionHelper: SQL Error: -99999, SQLState: 42703 
    15:15:22,025 ERROR SqlExceptionHelper: An undefined column name was detected.
    
    , холдинг0_.UpdateDate как UpdateDate1_, холдинг0_.Updater как Updater1_, холдинг0_.Description как Descript7
    WARN SqlExceptionHelper: SQL Error: -99999, SQLState: 42703 
    15:15:22,025 ERROR SqlExceptionHelper: An undefined column name was detected.
    
    , холдинг0_.HoldingName как HoldingN8
    WARN SqlExceptionHelper: SQL Error: -99999, SQLState: 42703 
    15:15:22,025 ERROR SqlExceptionHelper: An undefined column name was detected.
    
    из Холдинга 0_ где холдинг0_.RDeleted=? 13:26:38,428 ПРЕДУПРЕЖДЕНИЕ SqlExceptionHelper: ошибка SQL: -99999, SQLState: 42703 13:26:38,428 ОШИБКА SqlExceptionHelper: обнаружено неопределенное имя столбца.

Но это запрос работает:

Select h.holdingId, h.holdingName, h.description from Holding h

Мой источник данных:

<bean class="org.apache.commons.dbcp.BasicDataSource" id="dataSourceDB2_JT400" destroy-method="close">
        <property value="com.ibm.as400.access.AS400JDBCDriver" name="driverClassName"/> 
        <property value="jdbc:as400://192.168.1.1/GULERP" name="url"/> 
        <property value="user" name="username"/> 
        <property value="PW" name="password"/> 
        <property value="5" name="initialSize"/>
    </bean>

Мой менеджер сущностей:

<bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="erp" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="showSql" value="true" />
                <property name="generateDdl" value="false" />
                <property name="databasePlatform" value="org.hibernate.dialect.DB2400Dialect" />
            </bean>
        </property>
        <property name="dataSource" ref="dataSourceDB2_JT400"/>
    </bean>

и Мой домен:

@Entity
@AccessType("field")
@Table(name = "Holding", uniqueConstraints = {@UniqueConstraint(columnNames={"HoldingName"})})
public class Holding extends BaseClass implements Serializable {

    transient static final long serialVersionUID = 5473887143181971744L;

    @Id
    @Column(name = "HoldingId", nullable = false, length=36)
    @GeneratedValue(generator="system-uuid")
    @GenericGenerator(name = "system-uuid", strategy = "uuid")
    private String holdingId;

    @Basic(optional = false)
    @Column(name = "HoldingName", nullable = false, length = 100)
    private String holdingName;

    @Column(name = "Description", length = 210)
    private String description;

    @OneToMany(mappedBy = "holdingId", fetch = FetchType.LAZY)
    private List<Company> companyList;

person SaRPaRDa    schedule 09.07.2012    source источник
comment
Сравните все имена столбцов в запросе со всеми именами столбцов в таблице и найдите неправильное или отсутствующее из них.   -  person JB Nizet    schedule 09.07.2012
comment
Я проверил, имена столбцов все правильные. Запрос выполняется, если я пишу имена столбцов вручную. И я проверил запрос гибернации на клиенте DB2, запрос выполняется.   -  person SaRPaRDa    schedule 09.07.2012
comment
Покажите нам код, в котором вы выполняете запрос, и полное сопоставление сущности.   -  person JB Nizet    schedule 09.07.2012
comment
Я пробовал MS-SQL и HSQLDB, мои коды работали.   -  person SaRPaRDa    schedule 09.07.2012
comment
` @Override @SuppressWarnings(unchecked) @PreAuthorize(hasRole('ROLE_ADMIN')) public List‹Holding› getHoldingList() { List‹Holding› holdLst = null; try { Query qry = em.createQuery (выберите m из удержания m); //qry.setParameter(arg1, 0); HoldLst = qry.getResultList(); } catch(NoResultException e) { e.printStackTrace(); } поймать (исключение e) { бросить новое исключение RuntimeException (e); } вернуть HoldLst; }`   -  person SaRPaRDa    schedule 09.07.2012


Ответы (3)


Попробуйте выполнить запрос "из Холдинга ч". Если он все еще будет падать:

ОШИБКА SqlExceptionHelper: обнаружено неопределенное имя столбца.

тогда это означает, что вы неправильно сопоставили имена столбцов с именами свойств.


Вы упомянули, что работает следующий запрос:

Select h.holdingId, h.holdingName, h.description from Holding h

вы можете отследить столбец, вызывающий исключение, добавив все столбцы один за другим в выбор.

person JMelnik    schedule 09.07.2012
comment
если я запишу все имена столбцов в запрос, спящий режим запустится. Но новое сообщение об ошибке: chopapp.com/#lzijtk2d - person SaRPaRDa; 09.07.2012
comment
Исключение NumberFormatException решено. Запрос qry = em.createQuery(из Holding h, где h.RDeleted=:arg1,Holding.class); , - person SaRPaRDa; 10.07.2012
comment
проверьте мои журналы MS-SQL и DB2. MSSQL: chopapp.com/#8kvl5v3a DB2: chopapp.com/#bg4x8aki - person SaRPaRDa; 10.07.2012

Решение:

    @Override
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    public List<HoldingDto> getHoldingList()
    {
        List<HoldingDto> holdLst = null;
        try
        {
            String aa = (String) q.getSingleResult();

            CriteriaBuilder cb = em.getCriteriaBuilder();
            CriteriaQuery<HoldingDto> q = cb.createQuery(HoldingDto.class);
            Root<Holding> h = q.from(Holding.class);
            q.select(cb.construct(HoldingDto.class, h.get("holdingId"), h.get("holdingName"), h.get("description"), h.get("savesUserId"), h.get("insertDate"),
                    h.get("updateDate"), h.get("updater"), h.get("RDeleted")));
            holdLst = em.createQuery(q).getResultList();
        } 
        catch(NoResultException e)
        {
            e.printStackTrace();
        }
        catch (Exception e)
        {
            throw new RuntimeException(e);
        }

        return holdLst;
    }
person SaRPaRDa    schedule 11.07.2012

Запрос qry = em.createQuery("из холдинга h, где h.RDeleted=:arg1");-

не должно быть

Запрос qry = em.createQuery("выберите h из Hold h, где h.RDeleted=:arg1") ?

person Repoker    schedule 09.07.2012
comment
Hibernate не заботится о том, указан ли select h, он автоматически выберет корневой объект. - person JMelnik; 09.07.2012