[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-817) using projections is causing SQL query error on oracle (ORA-00904 error)

Kevin Schmidt (JIRA) noreply at atlassian.com
Wed Aug 22 14:57:57 EDT 2007


    [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-817?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_27914 ] 

Kevin Schmidt commented on HHH-817:
-----------------------------------

Chris,

    I appreciate your help with this issue.  I am using the Hibernate AliasToBean results transformer to effectivly lazy load specific properties of my Criteria and Queryies.  Essentially adding aliases with the same names as the properties to the criteria and then using the result transformer to only load the properties that are mentioned in the aliases.  As such this issue was causing me problems, I made a minor change to your class that fixed an issue where the wrong column was being returned.

Here is the fix.

	/**
	* Override to use the property's column if we have it (which we should).
	* Hack alert: This assumes that toSqlString gets called beforehand, which seems to be the case.
	* 
	* @author kevinrs
	* Note, I had to hack his hack so that this worked correctly.  It first checks if the given alias is backed by this Object, and only then
	* returna the column property value.
	*
	* @see org.hibernate.criterion.AliasedProjection#getColumnAliases(java.lang.String, int)
	*/
	public String[] getColumnAliases(String alias, int loc) {
		String[] returnValue = null;
		if(this.getAliases()[0].equals(alias) && propertyColumn != null) {
			returnValue = new String[] {propertyColumn};
		} else {
			returnValue = super.getColumnAliases(alias, loc);
		}
		return returnValue;
	}

Thanks so much for your help


> using projections is causing SQL query error on oracle (ORA-00904 error)
> ------------------------------------------------------------------------
>
>                 Key: HHH-817
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-817
>             Project: Hibernate3
>          Issue Type: Bug
>    Affects Versions: 3.0.5
>         Environment: Oracle 9.2.0.6, Hibernate 3.0.5, Spring Framework 1.2.2 based application working on Jakarta Tomcat 5.0.28
>            Reporter: Michal Jastak
>            Priority: Minor
>         Attachments: HHH-817.patch
>
>
> following java code:
> protected Entity loadEntityLightweight(Serializable entityId) throws DataAccessException {
>     Criteria criteria = getSession().createCriteria(Entity.class);    
>     ProjectionList projectionList = Projections.projectionList();
>     projectionList.add(Property.forName(BaseEntity.PROP_ID), BaseEntity.PROP_ID);
>     projectionList.add(Property.forName(BaseEntity.PROP_TYPE), BaseEntity.PROP_TYPE);
>     criteria.setProjection(projectionList);
>     criteria.add(Restrictions.eq(BaseEntity.PROP_ID, entityId));
>     criteria.setResultTransformer(new AliasToBeanResultTransformer(Entity.class));
>     return (Entity) criteria.uniqueResult();
>   }
> generates following SQL query:
> select this_.id as y0_, this_.type as y1_ from entities this_ left outer join facilities this_1_ on this_.id=this_1_.id left outer join users this_2_ on this_.id=this_2_.id left outer join addresses address2_ on this_.address_id=address2_.id left outer join entities entity3_ on this_2_.employer_id=entity3_.id left outer join facilities entity3_1_ on entity3_.id=entity3_1_.id left outer join users entity3_2_ on entity3_.id=entity3_2_.id where y0_=?
> y0_ = ? expression in where clause is causing a 904 error on Oracle 9:
> ORA-00904: "Y0_": invalid identifier
> hibernate dialect: org.hibernate.dialect.Oracle9Dialect
> mapping for Entity class:
> <?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 default-lazy="false" default-cascade="save-update">
>  
>   <class name="Entity" table="entities" mutable="true">
>     <id name="id" type="java.lang.Long" unsaved-value="null">
>       <generator class="sequence">
>         <param name="sequence">entities_id_seq</param>
>       </generator>
>     </id>
>     <many-to-one  name="address"   class="Address" column="address_id" />
>     ...
>     <!--
>       -  Facilities
>       -->
>     <joined-subclass name="Facility" table="facilities">
>       <key column="id" />
>       ...
>       <set name="users" inverse="true" lazy="true">
>         <key column="facility_id" />
>         <one-to-many class="User" />
>       </set>
>     </joined-subclass>
>     <!--
>       -  Users
>       -->
>     <joined-subclass name="User" table="users" dynamic-insert="true" dynamic-update="true">
>       <key column="id" />
>       <many-to-one name="employer"   class="Entity"  column="employer_id" cascade="none" />
>       ...
>       <set name="userAuthorities" inverse="true" cascade="all-delete-orphan">
>         <key          column="user_id" />
>         <one-to-many  class="Authority" />
>       </set>
>     </joined-subclass>
>   </class>
> </hibernate-mapping>

-- 
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