Uploaded image for project: 'JBoss Enterprise Application Platform 4 and 5'
  1. JBoss Enterprise Application Platform 4 and 5
  2. JBPAPP-6571

HHH-2536/HHH-2225 NPE in SQLQuery when Entity has @Formula attribute

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Done
    • Icon: Major Major
    • EAP_EWP 5.2.0
    • EAP_EWP 5.1.0
    • Hibernate
    • None
    • Workaround Exists
    • Hide
      @Entity
      @Table(name = "ALL_TABLES")
       public class AllTables {
      	@Id
      	@Column(name = "TABLE_NAME", nullable = false)
      	private String tableName;
      	@Formula(value = "(SYSDATE())")
      	private String daysOld;
      	//getters and setters
       }
      
      String sql = "select table_name , sysdate()  from all_tables   where table_name = 'AUDIT_ACTIONS' ";
      SQLQuery q = s.createSQLQuery( sql ).addEntity( "t",AllTables.class );
      

      workaround 1 – using @SqlResultSetMapping:

      String sql = "select table_name as t_name, sysdate() as t_time from all_tables   where table_name = 'AUDIT_ACTIONS' ";			
      @SqlResultSetMapping(name = "all",
      		entities = @EntityResult(entityClass = AllTables.class,
      				fields = {
      						@FieldResult(name = "tableName", column = "t_name"),
      						@FieldResult(name = "daysOld", column = "t_time")
      				}))
      workaround 2 -- provide alias for each scalar property:
      

      String sql = "select t.table_name as

      {t.tableName}

      , sysdate() as

      {t.daysOld}

      from all_tables t where t.table_name = 'AUDIT_ACTIONS' ";
      SQLQuery q = s.createSQLQuery( sql ).addEntity( "t",AllTables.class );

      workaround 3 -- query directly:
      

      String sql = "select table_name , sysdate() from all_tables where table_name = 'AUDIT_ACTIONS' ";
      SQLQuery q = s.createSQLQuery( sql );

      
      
      Show
      @Entity @Table(name = "ALL_TABLES" ) public class AllTables { @Id @Column(name = "TABLE_NAME" , nullable = false ) private String tableName; @Formula(value = "(SYSDATE())" ) private String daysOld; //getters and setters } String sql = "select table_name , sysdate() from all_tables where table_name = 'AUDIT_ACTIONS' " ; SQLQuery q = s.createSQLQuery( sql ).addEntity( "t" ,AllTables.class ); workaround 1 – using @SqlResultSetMapping: String sql = "select table_name as t_name, sysdate() as t_time from all_tables where table_name = 'AUDIT_ACTIONS' " ; @SqlResultSetMapping(name = "all" , entities = @EntityResult(entityClass = AllTables.class, fields = { @FieldResult(name = "tableName" , column = "t_name" ), @FieldResult(name = "daysOld" , column = "t_time" ) })) workaround 2 -- provide alias for each scalar property: String sql = "select t.table_name as {t.tableName} , sysdate() as {t.daysOld} from all_tables t where t.table_name = 'AUDIT_ACTIONS' "; SQLQuery q = s.createSQLQuery( sql ).addEntity( "t",AllTables.class ); workaround 3 -- query directly: String sql = "select table_name , sysdate() from all_tables where table_name = 'AUDIT_ACTIONS' "; SQLQuery q = s.createSQLQuery( sql );
    • Hide
      When an entity has attributes mapped as @Formula, and using native query, but select clause elements do not have an alias, and _addEntity_ is used, a NullPointerException would be thrown, for example:

      <programlisting lang="java">
      @Entity
      @Table(name = "ALL_TABLES")
       public class AllTables {
      @Id
      @Column(name = "TABLE_NAME", nullable = false)
      private String tableName;
      @Formula(value = "(SYSDATE())")
      private String daysOld;
      //getters and setters
       }
      </programlisting>

      <programlisting lang="java">String sql = "select table_name , sysdate() from all_tables where table_name = 'AUDIT_ACTIONS' ";
      SQLQuery q = s.createSQLQuery( sql ).addEntity( "t",AllTables.class );
      <programlisting lang="java">
      To resolve this issue would require major changes to Hibernate so this issue will remain unresolved. Use one of the following workarounds to avoid this issue:


      Workaround option 1: Use @SqlResultSetMapping:

      <programlisting lang="java">
      String sql = "select table_name as t_name, sysdate() as t_time from all_tables where table_name = 'AUDIT_ACTIONS' ";
      @SqlResultSetMapping(name = "all",
      entities = @EntityResult(entityClass = AllTables.class,
      fields = {
      @FieldResult(name = "tableName", column = "t_name"),
      @FieldResult(name = "daysOld", column = "t_time")
      }))
      </programlisting>


      Workaround option 2: Provide an alias for each scalar property:

      <programlisting lang="java">
      String sql = "select t.table_name as {t.tableName}, sysdate() as {t.daysOld} from all_tables t where t.table_name = 'AUDIT_ACTIONS' ";
      SQLQuery q = s.createSQLQuery( sql ).addEntity( "t",AllTables.class );
      </programlisting>


      Workaround option 3: Query directly:

      <programlisting lang="java">
      String sql = "select table_name , sysdate() from all_tables where table_name = 'AUDIT_ACTIONS' ";
      SQLQuery q = s.createSQLQuery( sql );
      </programlisting>
      Show
      When an entity has attributes mapped as @Formula, and using native query, but select clause elements do not have an alias, and _addEntity_ is used, a NullPointerException would be thrown, for example: <programlisting lang="java"> @Entity @Table(name = "ALL_TABLES")  public class AllTables { @Id @Column(name = "TABLE_NAME", nullable = false) private String tableName; @Formula(value = "(SYSDATE())") private String daysOld; //getters and setters  } </programlisting> <programlisting lang="java">String sql = "select table_name , sysdate() from all_tables where table_name = 'AUDIT_ACTIONS' "; SQLQuery q = s.createSQLQuery( sql ).addEntity( "t",AllTables.class ); <programlisting lang="java"> To resolve this issue would require major changes to Hibernate so this issue will remain unresolved. Use one of the following workarounds to avoid this issue: Workaround option 1: Use @SqlResultSetMapping: <programlisting lang="java"> String sql = "select table_name as t_name, sysdate() as t_time from all_tables where table_name = 'AUDIT_ACTIONS' "; @SqlResultSetMapping(name = "all", entities = @EntityResult(entityClass = AllTables.class, fields = { @FieldResult(name = "tableName", column = "t_name"), @FieldResult(name = "daysOld", column = "t_time") })) </programlisting> Workaround option 2: Provide an alias for each scalar property: <programlisting lang="java"> String sql = "select t.table_name as {t.tableName}, sysdate() as {t.daysOld} from all_tables t where t.table_name = 'AUDIT_ACTIONS' "; SQLQuery q = s.createSQLQuery( sql ).addEntity( "t",AllTables.class ); </programlisting> Workaround option 3: Query directly: <programlisting lang="java"> String sql = "select table_name , sysdate() from all_tables where table_name = 'AUDIT_ACTIONS' "; SQLQuery q = s.createSQLQuery( sql ); </programlisting>
    • Documented as Known Issue
    • NEW

      When an Entity has attributes mapped as @Formula, it is impossible to use native query (session.createSQLQuery).
      It fires the exception:

      java.lang.NullPointerException
      at org.hibernate.loader.DefaultEntityAliases.intern(DefaultEntityAliases.java:157)
      at org.hibernate.loader.DefaultEntityAliases.getSuffixedPropertyAliases(DefaultEntityAliases.java:130)
      at org.hibernate.loader.DefaultEntityAliases.<init>(DefaultEntityAliases.java:76)
      at org.hibernate.loader.ColumnEntityAliases.<init>(ColumnEntityAliases.java:40)
      at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.generateCustomReturns(SQLQueryReturnProcessor.java:197)
      at org.hibernate.loader.custom.sql.SQLCustomQuery.<init>(SQLCustomQuery.java:152)
      at org.hibernate.engine.query.NativeSQLQueryPlan.<init>(NativeSQLQueryPlan.java:67)
      at org.hibernate.engine.query.QueryPlanCache.getNativeSQLQueryPlan(QueryPlanCache.java:140)
      at org.hibernate.impl.AbstractSessionImpl.getNativeSQLQueryPlan(AbstractSessionImpl.java:160)
      at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165)

            shaozliu Strong Liu(刘少壮) (Inactive)
            rhn-support-alazarot Alessandro Lazarotti
            Russell Dickenson Russell Dickenson (Inactive)
            Votes:
            1 Vote for this issue
            Watchers:
            6 Start watching this issue

              Created:
              Updated:
              Resolved: