Cześć potrzebuję pomocy.
Mam problem z zapytaniem HQL i nie mogę odnaleźć przyczyny błędu który jest zwracany.
org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected AST node: query
at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:74) ~[hibernate-core-5.4.15.Final.jar:5.4.15.Final]
at org.hibernate.hql.internal.ast.ErrorTracker.throwQueryException(ErrorTracker.java:93) ~[hibernate-core-5.4.15.Final.jar:5.4.15.Final]
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:278) ~[hibernate-core-5.4.15.Final.jar:5.4.15.Final]
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:192) ~[hibernate-core-5.4.15.Final.jar:5.4.15.Final]
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:144) ~[hibernate-core-5.4.15.Final.jar:5.4.15.Final]
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:113) ~[hibernate-core-5.4.15.Final.jar:5.4.15.Final]
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:73) ~[hibernate-core-5.4.15.Final.jar:5.4.15.Final]
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:155) ~[hibernate-core-5.4.15.Final.jar:5.4.15.Final]
at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:604) ~[hibernate-core-5.4.15.Final.jar:5.4.15.Final]
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:716) ~[hibernate-core-5.4.15.Final.jar:5.4.15.Final]
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:779) ~[hibernate-core-5.4.15.Final.jar:5.4.15.Final]
at org.hibernate.query.criteria.internal.CriteriaQueryImpl$1.buildCompiledQuery(CriteriaQueryImpl.java:310) ~[hibernate-core-5.4.15.Final.jar:5.4.15.Final]
at org.hibernate.query.criteria.internal.compile.CriteriaCompiler.compile(CriteriaCompiler.java:165) ~[hibernate-core-5.4.15.Final.jar:5.4.15.Final]
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:742) ~[hibernate-core-5.4.15.Final.jar:5.4.15.Final]
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:113) ~[hibernate-core-5.4.15.Final.jar:5.4.15.Final]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
@Entity
@Table(name = "places")
@SequenceGenerator(name = "place_seq", sequenceName = "places_id_seq", initialValue = 1, allocationSize = 1)
@Setter
@Getter
public class Place implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(generator = "place_seq", strategy = GenerationType.SEQUENCE)
private Long id;
@OneToOne
@JoinColumn(name = "point_id")
private Point point;
@OneToMany
@JoinColumn(name = "place_id")
private List<PlaceHasProduct> placeHasProducts = new LinkedList<>();
...
}
@Entity
@Table(name = "place_has_products")
@SequenceGenerator(name = "place_has_product_seq", sequenceName = "place_has_products_id_seq", initialValue = 1, allocationSize = 1)
@Setter
@Getter
public class PlaceHasProduct implements Serializable {
private static final long serialVersionUID = 2L;
@Id
@GeneratedValue(generator = "place_has_product_seq", strategy = GenerationType.SEQUENCE)
private Long id;
@ManyToOne
@JoinColumn(name = "product_id")
private Product product;
...
}
@Entity
@Table(name = "products")
@SequenceGenerator(name = "product_seq", sequenceName = "products_id_seq", initialValue = 1, allocationSize = 1)
@Setter
@Getter
public class Product implements Serializable {
private static final long serialVersionUID = 3L;
@Id
@GeneratedValue(generator = "product_seq", strategy = GenerationType.SEQUENCE)
private Long id;
private String name;
...
}
Zapytanie HQL
select
distinct generatedAlias0
from
app.place.model.Place as generatedAlias0
inner join generatedAlias0.placeHasProducts as generatedAlias1
inner join generatedAlias1.productHasOutsourcings as generatedAlias2
where
( generatedAlias0.activeSubscription = true ) and
( generatedAlias0.point in (10L, 189L) ) and
( generatedAlias1.product in (1L, 2L, 3L) )
order by
(
select
distinct count(generatedAlias3)
from
app.place.model.PlaceHasProduct as generatedAlias3
where
( generatedAlias3=generatedAlias0.placeHasProducts )
and
( generatedAlias3.product in (1L, 2L, 3L) )
) asc
Zapytanie jest generowane przez CriteriaBuilder i wygląda prawidłowo. Znalazłem kilka postów z podobnym problemem (~2008r.), H nie mógł poprawnie sparsowac selecta w orderze. Ponoć zostało to poprawione w wersji Hibernate 3.6 więc sądzę że przyczyna leży zupełnie w innym miejscu.
distinct
wylatuje[1,3,3,5]
i[2,2,3]
. Nadal nie wiem co z tym zrobić (jako baza damych :-) ).