[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-1088) IdentifierProjection does not work with composite keys

David (JIRA) noreply at atlassian.com
Thu Dec 3 17:27:13 EST 2009


    [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-1088?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=34857#action_34857 ] 

David commented on HHH-1088:
----------------------------

I came across this problem today.  I have a composite key (legacy tables) but each row contains a lot of data and we are doing some paging.  We execute a query and store the composite keys to the results in the user's session.  Each page, we can grab the IDs from the session and load the data from the database for that page.

Would be nice to fix this but here was my fix for anyone else that comes across this:

Assuming your composite key has an id of "id"

ProjectionList projList = Projections.projectionList();
projList.add(Projections.property("id.col1"));
projList.add(Projections.property("id.col2"));

After the query...

while (results.next()) {
   CompKeyId id = new CompKeyId (results.get(0), results.get(1));
}

> IdentifierProjection does not work with composite keys
> ------------------------------------------------------
>
>                 Key: HHH-1088
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-1088
>             Project: Hibernate Core
>          Issue Type: Bug
>          Components: query-criteria
>    Affects Versions: 3.1 rc2
>            Reporter: Max Muermann
>         Attachments: CompositeIdProjection.java, CriteriaLoader.java
>
>
> When working with Criteria queries, the IdentifierProjection breaks if the entity has a composite key.
> In IdentifierProjection.java:
> public String toSqlString(Criteria criteria, int position, CriteriaQuery criteriaQuery) 
> 	throws HibernateException {
> 		StringBuffer buf = new StringBuffer();
> 		String[] cols = criteriaQuery.getIdentifierColumns(criteria);
> 		for ( int i=0; i<cols.length; i++ ) {
> 			buf.append( cols[i] )
> 				.append(" as y")
> 				.append(position + i)
> 				.append('_');
> 		}
> 		return buf.toString();
> 	}
> This method does not add commas as separators between the column names. Easily fixed by adding
> if (i<col.length-1)
>   buf.append(",");
> as the last statement inside the loop.
> However, this leads to another problem:
> the type returned by IdentifierProjection.geType is the (single) type of the composite id component. The query will however return the property values of the id component without a mapping step.

-- 
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.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the hibernate-issues mailing list