#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)
как aorg.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/… ), который воспроизводит проблему.