KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > hibernate > cfg > annotations > QueryBinder


1 //$Id: QueryBinder.java,v 1.12 2005/07/15 05:12:45 epbernard Exp $
2
package org.hibernate.cfg.annotations;
3
4 import java.util.HashMap JavaDoc;
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 /**
29  * Query binder
30  *
31  * @author Emmanuel Bernard
32  */

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         //EJBQL Query
41
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         //ResultSetMappingDefinition mappingDefinition = mappings.getResultSetMapping( queryAnn.resultSetMapping() );
56
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 JavaDoc resultSetMapping = queryAnn.resultSetMapping();
61         if (! AnnotationBinder.isDefault( resultSetMapping ) ) {
62             //sql result set usage
63
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             //class mapping usage
77
//FIXME should be done in a second pass due to entity name?
78
final SQLQueryRootReturn entityQueryReturn =
79                     new SQLQueryRootReturn("alias1", queryAnn.resultClass().getName(), new HashMap JavaDoc(), 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         //TODO add parameters checkings
116
if (ann == null) return;
117         ResultSetMappingDefinition definition = new ResultSetMappingDefinition( ann.name() );
118         for ( ColumnResult column : ann.columns() ) {
119             //TODO implements it
120
throw new NotYetImplementedException("Scalar returns are not supported");
121         }
122         int aliasIndex=0;
123         for ( EntityResult entity : ann.entities() ) {
124             //TODO parameterize lock mode?
125
HashMap JavaDoc propertyresults = new HashMap JavaDoc();
126             for ( FieldResult field : entity.fields() ) {
127                 propertyresults.put( field.name(), new String JavaDoc[] { field.column() } );
128             }
129             if (! AnnotationBinder.isDefault( entity.discriminatorColumn() ) ) {
130                 propertyresults.put("class", new String JavaDoc[] { 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