Я получаю столбец». как col_2_0_» в JPA CriteriaQuery

#hibernate #jpa

Вопрос:

У меня возникла эта запутанная проблема, когда я пытаюсь запросить отношения @OneToMany с помощью JPA CriteriaQuery , где есть эти столбцы с именем . as col_2_0_ (обратите внимание на точку), в этом столбце нет ничего, кроме точки. И, очевидно, возникает ожидание: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '. as col_2_0_, stockdetai1_.id as id1_6_, stockdetai1_.active as active2_6_, sto' at line 1 вот сопоставления

Product.class

 public class Product {

    @Id
    @GeneratedValue(generator = ProductIdGenerator.NAME)
    @GenericGenerator(name = ProductIdGenerator.NAME, strategy = ProductIdGenerator.PATH)
    @Column(updatable = false, length = IDENTIFIER_LENGTH, columnDefinition = "VARCHAR(11)")
    private String id;
    // other columns

    //-----------problem here-----------//
    @JsonIgnore
    @OneToMany(mappedBy = "product")
    private List<StockDetail> stockDetails;
    //----------------------------------//

    // getters and setters
}
 

StockDetail.class

 public class StockDetail {
    @Id
    @GeneratedValue(generator = StockDetailIdGenerator.NAME)
    @GenericGenerator(name = StockDetailIdGenerator.NAME, strategy = StockDetailIdGenerator.PATH)
    @Column(columnDefinition = "VARCHAR(20)", updatable = false)
    private String id;

    //---------here's the foreign key---------//
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Product product;
    //---------here's the foreign key---------//
    // other columns
    // getters and setters
}
 

Вот запрос

 Session session = getCurrentSession();
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Tuple> query = builder.createQuery(Tuple.class);
Root<E> root = query.from(type);

query = selectColumns(query, root, columns).where(builder.and(isActive(builder, root),
    builder.equal(root.get(HibernateHelper.getIdentifierPropertyName(type)), id)));

return session.createQuery(query).getResultStream().findFirst().orElse(null);
 

Вот ведение журнала запросов в режиме гибернации

 Hibernate: 
select
    product0_.active as col_0_0_,
    product0_.name as col_1_0_,
    . as col_2_0_, // unknown column
    stockdetai1_.id as id1_6_,
    stockdetai1_.active as active2_6_,
    stockdetai1_.color as color3_6_,
    stockdetai1_.description as descript4_6_,
    stockdetai1_.material as material5_6_,
    stockdetai1_.numeric_size as numeric_6_6_,
    stockdetai1_.product_id as product10_6_,
    stockdetai1_.provider_id as provide11_6_,
    stockdetai1_.size as size7_6_,
    stockdetai1_.sold_by as sold_by12_6_,
    stockdetai1_.status as status8_6_,
    stockdetai1_.stocked_by as stocked13_6_,
    stockdetai1_.stocked_date as stocked_9_6_ 
from
    products product0_ 
inner join
    stock_details stockdetai1_ 
        on product0_.id=stockdetai1_.product_id 
where
    product0_.active=1 
    and product0_.id=?
 

Схема БД

введите описание изображения здесь

Я проверил запрошенные столбцы, чтобы узнать, были ли какие-либо нежелательные/неизвестные/необычные столбцы, но все они были чистыми. Исключение было сделано только из DBMS , а не из ORM . Я действительно не хочу отдельно извлекать StockDetail данные с помощью другого запроса. Спасибо вам за любую помощь, ребята.

Комментарии:

1. Можете ли вы показать схему БД? Кроме того, пожалуйста, удалите большинство других столбцов — они не имеют отношения к вашей проблеме, и включение их в ваш вопрос только добавляет беспорядка.

2. Спасибо за ответ, я только что обновил вопрос

3. Мы видим, что он генерирует плохой собственный запрос, но как насчет запроса JPQL? Сохраните session.createQuery(query) как a org.hibernate.query.Query и вызовите getQueryString() его, чтобы получить запрос JPQL, и зарегистрируйте его. Кроме того, если ошибка не находится в спящем режиме, то она где-то в тех // other columns , которые вы пропустили.

4. @coladict Привет, select generatedAlias0.active, generatedAlias0.name, generatedAlias0.stockDetails from Product as generatedAlias0 where ( generatedAlias0.active = true ) and ( generatedAlias0.id=:param0 ) вот запрос JPQL, о котором вы говорите, и я, честно говоря, не смог обнаружить никакого мошенничества.

5. Вы уверены, что обновили Hibernate до последней версии 5.4.32/5.5.7? Если это так, и у вас все еще есть проблема, пожалуйста, создайте проблему в трекере проблем( hibernate.atlassian.net ) с тестовым случаем( github.com/hibernate/hibernate-test-case-templates/blob/master/… ), который воспроизводит проблему.