[Hibernate-JIRA] Created: (HHH-6913) QuerySyntaxException for valid JPQL query using the IN operator
by Luis Fernando Planella Gonzalez (JIRA)
QuerySyntaxException for valid JPQL query using the IN operator
---------------------------------------------------------------
Key: HHH-6913
URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-6913
Project: Hibernate Core
Issue Type: Bug
Components: query-hql
Affects Versions: 3.6.9
Environment: Hibernate 3.6.9, MySQL 5.1
Reporter: Luis Fernando Planella Gonzalez
The following query, which is valid JPQL:
select person
from Person person
where person.id is not null and (person.category is null or person.category in :a1)
Generates the following error:
org.hibernate.hql.ast.QuerySyntaxException: unexpected AST node: {vector} [select person
from entities.Person person
where person.id is not null and (person.category is null or person.category in :a10_, :a11_)]
The in clause is not correct.
Note that if removing the 'person.id is not null and' part, the query works. Here is the working example:
select person
from Person person
where person.category is null or person.category in :a1
So, the closing parenthesis must be confusing the IN clause handling.
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira
12 years, 1 month
[Hibernate-JIRA] Created: (HHH-6924) Assertion Failure when building metadata of a class with an Identifier inherited from a MappedSuperclass
by Tom Coogan (JIRA)
Assertion Failure when building metadata of a class with an Identifier inherited from a MappedSuperclass
--------------------------------------------------------------------------------------------------------
Key: HHH-6924
URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-6924
Project: Hibernate Core
Issue Type: Bug
Affects Versions: 4.0.0.Final
Environment: Hibernate Core 4.0.0.Final
Hibernate Commons Annotations 4.0.1.Final
PostgreSQL 9.1.2
Reporter: Tom Coogan
Priority: Critical
Our model classes inherit their identifiers from a MappedSuperclass as follows:
{code}
@MappedSuperclass
public abstract class GenericModel {
protected Long id;
@Id
@GeneratedValue(generator="postgres-seq")
@GenericGenerator(name="postgres-seq", strategy = "com.zzz.zzz.util.PostgresSequenceGenerator")
@Column(name = "id", nullable = false)
public Long getId() { return this.id; }
public void setId(Long id) { this.id = id; }
}
@Entity
@Table(name="users")
public class User extends GenericModel {
...
}
{code}
When building the metadata for these classes, the following AssertionFailure occurs:
{noformat}
org.hibernate.AssertionFailure: The root entity needs to specify an identifier
at org.hibernate.metamodel.source.annotations.entity.RootEntitySourceImpl.getIdentifierSource(RootEntitySourceImpl.java:63)
at org.hibernate.metamodel.source.binder.Binder.bindIdentifier(Binder.java:309)
at org.hibernate.metamodel.source.binder.Binder.makeRootEntityBinding(Binder.java:183)
at org.hibernate.metamodel.source.binder.Binder.createBasicEntityBinding(Binder.java:159)
at org.hibernate.metamodel.source.binder.Binder.doCreateEntityBinding(Binder.java:147)
at org.hibernate.metamodel.source.binder.Binder.createEntityBinding(Binder.java:132)
at org.hibernate.metamodel.source.binder.Binder.processEntityHierarchy(Binder.java:108)
at org.hibernate.metamodel.source.annotations.AnnotationMetadataSourceProcessorImpl.processMappingMetadata(AnnotationMetadataSourceProcessorImpl.java:134)
at org.hibernate.metamodel.source.internal.MetadataImpl.bindMappingMetadata(MetadataImpl.java:195)
at org.hibernate.metamodel.source.internal.MetadataImpl.<init>(MetadataImpl.java:165)
at org.hibernate.metamodel.source.internal.MetadataBuilderImpl.buildMetadata(MetadataBuilderImpl.java:83)
at org.hibernate.metamodel.MetadataSources.buildMetadata(MetadataSources.java:112)
{noformat}
It appears that this is happening because EntityClass is always instantiated with a null parent from EntityHierarchyBuilder.createEntityHierarchies(AnnotationBindingContext bindingContext) line 105:
{code}
EntityClass rootEntityClass = new EntityClass(
rootClassInfo,
null,
defaultAccessType,
hierarchyInheritanceType,
bindingContext
);
{code}
and therefore EntityClass.findIdAnnotations(DotName idAnnotationType) never loops through the parent hierarchy to find the @Id annotation in the MappedSuperclass.
This was working in Hibernate 3.6.*.
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira
12 years, 1 month
[Hibernate-JIRA] Created: (HHH-2891) Query cache fails on many-to-many select
by Oleg Efimov (JIRA)
Query cache fails on many-to-many select
----------------------------------------
Key: HHH-2891
URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-2891
Project: Hibernate3
Issue Type: Bug
Components: query-hql
Affects Versions: 3.2.5
Reporter: Oleg Efimov
I have two entities, User and Group, with many-to-many relation:
-------------------------------------------------------------------------------------------------- User.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="test.hibernate">
<class name="User" table="`USER`">
<id name="id" type="long" unsaved-value="null">
<column name="USER_ID" not-null="true"/>
<generator class="native"/>
</id>
<property name="login">
<column name="LOGIN" not-null="true" length="255"/>
</property>
<bag name="groups" table="USER_GROUP" lazy="false" cascade="none">
<key column="USER_ID"/>
<many-to-many class="Group" column="GROUP_ID"/>
</bag>
</class>
</hibernate-mapping>
-------------------------------------------------------------------------------------------------- Group.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="test.hibernate">
<class name="Group" table="`GROUP`">
<id name="id" type="long" unsaved-value="null">
<column name="GROUP_ID" not-null="true"/>
<generator class="native"/>
</id>
<property name="name">
<column name="GROUPNAME" not-null="true" length="100"/>
</property>
<bag name="users" table="USER_GROUP" lazy="true" inverse="true" cascade="all-delete-orphan">
<key column="GROUP_ID"/>
<many-to-many class="User" column="USER_ID"/>
</bag>
</class>
<query name="Group.select.by.login" cacheable="true"><![CDATA[
select user.groups from User user where user.login=?
]]>
</query>
</hibernate-mapping>
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
test.hibernate.User and test.hibernate.Group classes are just simple beans.
In Group.hbm.xml there is a query called "Group.select.by.login", it's intended to be cached. So I add corresponding properties to Hibernate configuraition:
--------------------------------------------------------------------------------------------------
properties.put("hibernate.cache.provider_class", "org.hibernate.cache.EhCacheProvider");
properties.put("hibernate.cache.use_query_cache", "true");
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Configuration has no extra parameters.
Then I'm trying to execute the query two times:
-------------------------------------------------------------------------------------------------- test fragment
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = null;
try {
session = sessionFactory.openSession();
Query query = session.getNamedQuery("Group.select.by.login");
List<Group> groups;
groups = query.setParameter(0, "admin").list(); // +++++++++++++++This list() returns list of two Group objects, ok +++++++++++++++
System.out.println("-----------------------------------------------------------------------------------");
for (Group group : groups) {
System.out.println(group.getName());
}
System.out.println("-----------------------------------------------------------------------------------");
groups = query.setParameter(0, "admin").list(); // +++++++++++++++This list() returns list of two nulls +++++++++++++++
System.out.println("-----------------------------------------------------------------------------------");
for (Group group : groups) {
System.out.println(group.getName());
}
System.out.println("-----------------------------------------------------------------------------------");
} finally {
if (session != null) {
session.close();
}
sessionFactory.close();
}
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
The first query returns list of, in my case, two groups. The second query returns list of two nulls instead of the same list.
I've investigated the problem, and found the following:
Query return value is "user.groups", and during query analysis (org.hibernate.hql.ast.QueryTranslatorImpl:160) query return type is defined as "org.hibernate.type.BagType(test.hibernate.User.groups)". This seems to be the problem, as during query put operation org.hibernate.CollectionType.disassemble is called (org.hibernate.cache.StandardQueryCache:80), which simply returns null as owner is null.
If this query is not a misuse, then I think, something is to be done at the time of analysis, so that return type be somewhat different.
Thanks.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators....
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
12 years, 1 month