[Hibernate-JIRA] Created: (HHH-7243) Wrong SQL statement generated due to a name collision of column aliases
by Gerald Brose (JIRA)
Wrong SQL statement generated due to a name collision of column aliases
-----------------------------------------------------------------------
Key: HHH-7243
URL: https://hibernate.onjira.com/browse/HHH-7243
Project: Hibernate ORM
Issue Type: Bug
Components: core
Affects Versions: 3.6.10, 3.6.9
Environment: Hibernate 3.6.9.Final, MS SQL Server 2008 R2, (Spring, JPA2)
Reporter: Gerald Brose
Priority: Critical
Under certain conditions, Hibernate generates a wrong SQL query due to a name collision of the generated column aliases used when accessing collections.
This is done in the class AbstractCollectionPersister, which creates the same column alias (in our case the alias is "SUCHMASKE8_") for an index column (original column name: "SUCHMASKE_ORDER") and a foreign key column ("SUCHMASKE") in a OneToMany association.
As a consequence, the resulting SQL statement selects from only one of the required columns. (In our case, this results in the integer value of a FK being used as a collection index, which in turn leads to a huge collection all initialized with null values).
Some information on the mapping:
from entity class SUCHMASKE:
@JoinColumn(name="SUCHMASKE")
@OneToMany
@OrderColumn(name="SUCHMASKE_ORDER")
public List<Suchkriterium> getSuchkriterien() {
return suchkriterien;
}
from entity class Suchkriterium:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "SUCHMASKE")
@MetaModelName("Suchmaske")
public Suchmaske getSuchmaske() {
return suchmaske;
}
Both entity classes share the same ancestor class in the inheritance hierarchy, strategy is joined inheritance. There is no join table. The @JoinColumn is used work around the well-known Hibernate limitation that OrderColumns are not updated if specified on the non-owning side.
Analysis:
This alias name collision occurs in the case where both the unique integers used to create the aliases are the same (here: "8"). In one case this integer is coming from the root table in an inheritance hierarchy, in the other case from the column itself). Additionally, the two original column names share the same prefix ("SUCHMASKE"). Both these conditions are IMO completely legal. The integer value collision is somewhat random (so it took us days to identify the problem...). The prefix match is a even a regular naming scheme for order columns that correspond to an association.
The actual problem is that Hibernate uses slightly different ways to create these alias names for key columns and index columns (cf. AbstractCollectionPersister, lines 299 and 387, respectively).
As a workaround, we have to use an additional column naming convention for order columns so that common prefixes are avoided. This means we have to modify our existing schema and application, which is a nuisance. A bug fix in Hibernate would obviously be preferable.
--
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: (HSEARCH-726) Facetted search on embedded collections takes only first element from collection
by Elmer van Chastelet (JIRA)
Facetted search on embedded collections takes only first element from collection
--------------------------------------------------------------------------------
Key: HSEARCH-726
URL: http://opensource.atlassian.com/projects/hibernate/browse/HSEARCH-726
Project: Hibernate Search
Issue Type: Bug
Components: query
Affects Versions: 3.4.0.CR2, 3.4.0.CR1, 3.4.0.Beta1, 3.4.0.Alpha1
Environment: Any valid config I suppose, tested using Hibernate Core 3.6.3 + Search 3.4.0.CR2, mysql and in Hibernate Search test environment
Reporter: Elmer van Chastelet
Attachments: EmbeddedCollectionsFacetsTest.zip
>From [Hibernate Search Forum: Bug or not? Faceted search + embedded fields (*tomany)|https://forum.hibernate.org/viewtopic.php?f=9&t=1010472&start=0].
Faceted search won't work correctly when used on collections. For the cause I quote Hardy Ferentschik : ??The current faceting implementation utilizes the Lucene FieldCache which has a limitation that each document must have a single value for the specified field.??
I can think of many use cases in which faceted search on collections is really needed, some examples:
Facetting on authors when searching for publications
Facetting on ingredients when searching for recipes
Facetting on actors when searching for movies
...
Attached is a hibernate search test case. It fails on retrieving the right amount of matched authors.
Currently I don't have the needed insight to suggest an improvement on current implementation to make it compatible with collections. Hopefully it can be achieved with small changes. Good luck :)
--
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
[Hibernate-JIRA] Created: (HHH-2776) Restrictons.in(..) generates invalid SQL if list of values is empty
by Adrian Smith (JIRA)
Restrictons.in(..) generates invalid SQL if list of values is empty
-------------------------------------------------------------------
Key: HHH-2776
URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-2776
Project: Hibernate3
Issue Type: Bug
Components: query-criteria
Affects Versions: 3.2.2
Environment: Hibernate 3.2.2.ga, MySQL 4.1.18, Windows XP
Reporter: Adrian Smith
I have classes called A and B. There is a 1:n relationship from A to B.
Class B has the following in its mapping file:
<many-to-one name="a" class="A" column="fk_a_id" not-null="true" />
If I write the following code:
List<B> foo() {
List<A> aList = ....
Session session = ....
Criteria query = session.createCriteria(B.class);
query.add(Restrictions.in("a", aList));
return query.list();
}
Then all works fine and the results I want are returned. However, if aList is empty (i.e. aList.size()==0) then the query.list function generates and executes invalid SQL for MySQL.
java.sql.SQLException: Syntax error or access violation message from server: "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 ')' at line 1"
I imagine that it is generating SQL like IN () which isn't valid.
I realize it's a bit ridiculous to want to find the rows where a field is IN the empty list. Nothing will ever be returned. However, in my opinion it should still be allowed, and return no rows, just as saying "WHERE 1=2" is allowed, just doesn't return any rows.
--
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
[Hibernate-JIRA] Created: (HCANN-17) SecondaryTable JoinColumn cannot reference a non primary key
by Krashan Brahmanjara (JIRA)
SecondaryTable JoinColumn cannot reference a non primary key
------------------------------------------------------------
Key: HCANN-17
URL: http://opensource.atlassian.com/projects/hibernate/browse/HCANN-17
Project: Hibernate Commons Annotations
Issue Type: Bug
Affects Versions: 3.1.0.GA
Environment: Hibernate libraries added to jboss-6.0.0.20100216-M2(3.5) and jboss-5.1.0.GA(3.3.1) used with postgresql-8.3.7-1 database and jdbc driver postgresql-8.3-603.jdbc4.jar
Reporter: Krashan Brahmanjara
Hibertate annotations reject correct annotations with an error
Full exception
org.hibernate.AnnotationException: SecondaryTable JoinColumn cannot reference a non primary key
at org.hibernate.cfg.annotations.TableBinder.bindFk(TableBinder.java:243)
at org.hibernate.cfg.annotations.EntityBinder.bindJoinToPersistentClass(EntityBinder.java:520)
at org.hibernate.cfg.annotations.EntityBinder.createPrimaryColumnsToSecondaryTable(EntityBinder.java:510)
at org.hibernate.cfg.annotations.EntityBinder.finalSecondaryTableBinding(EntityBinder.java:441)
at org.hibernate.cfg.SecondaryTableSecondPass.doSecondPass(SecondaryTableSecondPass.java:25)
Example
Three entity, two connected to main 'dokument' by their id columns
@Entity
@Table(name = "dokument")
@SecondaryTables(value = {
@SecondaryTable(name = "dokument_status", pkJoinColumns = @PrimaryKeyJoinColumn(name = "id_status", referencedColumnName = "id_status")),
@SecondaryTable(name = "typ_dok", pkJoinColumns = @PrimaryKeyJoinColumn(name = "id_type", referencedColumnName = "id_type")) })
public class PosrDokument implements Serializable {
@Id
@Column(name="id_dokumentu", unique=true, nullable=false)
private int id_dokumentu;
@Column(name = "status", table = "dokument_status", nullable = false, insertable = false, updatable = false)
private String status;
@Column(name = "name", table = "typ_dok", nullable = false, insertable = false, updatable = false)
private String name;
(...)
--
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
[Hibernate-JIRA] Created: (HHH-2831) Native SQL queries with addJoin or <return-join/> return object arrays instead of single Entities
by Jeremy Grodberg (JIRA)
Native SQL queries with addJoin or <return-join/> return object arrays instead of single Entities
-------------------------------------------------------------------------------------------------
Key: HHH-2831
URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-2831
Project: Hibernate3
Issue Type: Bug
Components: query-sql
Affects Versions: 3.2.5, 3.2.4
Environment: Hibernate 3.2.4.ga and 3.2.5.ga with hsqldb on Win XP
Reporter: Jeremy Grodberg
Attachments: NativeSQLQueriesTest.patch
Although the documentation is not crystal clear, I read it to say that using addJoin should eagerly fetch an associated object but should NOT return it as a separate value. In section 16.1.3. "Handling associations and collections" of the online documentation it says: "It is possible to eagerly join in the Dog to avoid the possible extra roundtrip for initializing the proxy. This is done via the addJoin() method, which allows you to join in an association or collection." This comes BEFORE the section on returning multiple entities, so I say the documentation at least implies it will only return a single entity at the top level. Also, if the intention is to return multiple entities, addEntity() works fine for that, so what then would be the difference of addJoin()? If I'm wrong about what addJoin() should do, please clarify that in the documentation and also clarify how, if it is possible, one could eagerly fetch the association without changing the return type of the quer
y.
I have reproduced this problem in the Hibernate JUnit tests in 3.2.4.ga and 3.2.5.ga, specifically NativeSQLQueriesTest.testSQLQueryInterface().
I'm attaching a patch to the Hibernate junit test org.hibernate.test.sql.hand.query.NativeSQLQueriesTest.java released in 3.2.5.ga that adds a test to ensure that a query with addJoin only returns a (list of) entities, not a list of Object arrays containing entities. Currently, the assertion fails because instead of returning a list of Organizations we get a list of Object[3] = { Organization, Employment, Person }, which is exactly what we get when the addJoin()s are replaced with appropriate addEntity() calls.
--
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