1 package org.hibernate.cfg.annotations; 3 4 import java.util.HashMap ; 5 import javax.persistence.ColumnResult; 6 import javax.persistence.EntityResult; 7 import javax.persistence.FieldResult; 8 import javax.persistence.NamedNativeQueries; 9 import javax.persistence.NamedNativeQuery; 10 import javax.persistence.NamedQueries; 11 import javax.persistence.NamedQuery; 12 import javax.persistence.SqlResultSetMapping; 13 14 import org.apache.commons.logging.Log; 15 import org.apache.commons.logging.LogFactory; 16 import org.hibernate.AnnotationException; 17 import org.hibernate.LockMode; 18 import org.hibernate.cfg.AnnotationBinder; 19 import org.hibernate.cfg.ExtendedMappings; 20 import org.hibernate.cfg.NotYetImplementedException; 21 import org.hibernate.engine.NamedQueryDefinition; 22 import org.hibernate.engine.NamedSQLQueryDefinition; 23 import org.hibernate.engine.ResultSetMappingDefinition; 24 import org.hibernate.loader.custom.SQLQueryReturn; 25 import org.hibernate.loader.custom.SQLQueryRootReturn; 26 import org.hibernate.loader.custom.SQLQueryScalarReturn; 27 28 33 public abstract class QueryBinder { 34 private static Log log = LogFactory.getLog(QueryBinder.class); 35 public static void bindQuery(NamedQuery queryAnn, ExtendedMappings mappings) { 36 if (queryAnn == null) return; 37 if ( AnnotationBinder.isDefault( queryAnn.name() ) ) { 38 throw new AnnotationException("A named query must have a name when used in class or package level"); 39 } 40 NamedQueryDefinition query = new NamedQueryDefinition( 42 queryAnn.queryString(), 43 false, 44 null, 45 null, 46 null, 47 null, 48 null); 49 mappings.addQuery(queryAnn.name(), query); 50 log.debug( "Named query " + queryAnn.name() + " => " + queryAnn.queryString() ); 51 } 52 53 public static void bindNativeQuery(NamedNativeQuery queryAnn, ExtendedMappings mappings) { 54 if (queryAnn == null) return; 55 if ( AnnotationBinder.isDefault( queryAnn.name() ) ) { 57 throw new AnnotationException("A named query must have a name when used in class or package level"); 58 } 59 NamedSQLQueryDefinition query; 60 String resultSetMapping = queryAnn.resultSetMapping(); 61 if (! AnnotationBinder.isDefault( resultSetMapping ) ) { 62 query = new NamedSQLQueryDefinition( 64 queryAnn.queryString(), 65 resultSetMapping, 66 null, 67 false, 68 null, 69 null, 70 null, 71 null, 72 null, 73 false); 74 } 75 else if (! void.class.equals( queryAnn.resultClass() ) ) { 76 final SQLQueryRootReturn entityQueryReturn = 79 new SQLQueryRootReturn("alias1", queryAnn.resultClass().getName(), new HashMap (), LockMode.READ); 80 query = new NamedSQLQueryDefinition( 81 queryAnn.queryString(), 82 new SQLQueryReturn[] { entityQueryReturn }, 83 new SQLQueryScalarReturn[0], 84 null, 85 false, 86 null, 87 null, 88 null, 89 null, 90 null, 91 false); 92 } 93 else { 94 throw new NotYetImplementedException("Pure native scalar queries are not yet supported"); 95 } 96 mappings.addSQLQuery(queryAnn.name(), query); 97 log.debug( "Named native query " + queryAnn.name() + " => " + queryAnn.queryString() ); 98 } 99 100 public static void bindQueries(NamedQueries queriesAnn, ExtendedMappings mappings) { 101 if (queriesAnn == null) return; 102 for ( NamedQuery q : queriesAnn.value() ) { 103 bindQuery(q, mappings); 104 } 105 } 106 107 public static void bindNativeQueries(NamedNativeQueries queriesAnn, ExtendedMappings mappings) { 108 if (queriesAnn == null) return; 109 for ( NamedNativeQuery q : queriesAnn.value() ) { 110 bindNativeQuery(q, mappings); 111 } 112 } 113 114 public static void bindSqlResultsetMapping(SqlResultSetMapping ann, ExtendedMappings mappings) { 115 if (ann == null) return; 117 ResultSetMappingDefinition definition = new ResultSetMappingDefinition( ann.name() ); 118 for ( ColumnResult column : ann.columns() ) { 119 throw new NotYetImplementedException("Scalar returns are not supported"); 121 } 122 int aliasIndex=0; 123 for ( EntityResult entity : ann.entities() ) { 124 HashMap propertyresults = new HashMap (); 126 for ( FieldResult field : entity.fields() ) { 127 propertyresults.put( field.name(), new String [] { field.column() } ); 128 } 129 if (! AnnotationBinder.isDefault( entity.discriminatorColumn() ) ) { 130 propertyresults.put("class", new String [] { entity.discriminatorColumn() } ); 131 } 132 SQLQueryRootReturn result = 133 new SQLQueryRootReturn("alias" + aliasIndex++, entity.name(), propertyresults, LockMode.READ); 134 definition.addEntityQueryReturn(result); 135 } 136 mappings.addResultSetMapping(definition); 137 } 138 } 139 | Popular Tags |