You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2017/03/22 14:36:07 UTC

cayenne git commit: CAY-2261 Replace NamedQuery with MappedXYZ in *datamap.vm

Repository: cayenne
Updated Branches:
  refs/heads/master 9cc58c63f -> c4e8ef895


CAY-2261 Replace NamedQuery with MappedXYZ in *datamap.vm


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/c4e8ef89
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/c4e8ef89
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/c4e8ef89

Branch: refs/heads/master
Commit: c4e8ef895a147614c69c6f888124cbbada1ecb9f
Parents: 9cc58c6
Author: Nikita Timofeev <st...@gmail.com>
Authored: Wed Mar 22 17:35:47 2017 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Wed Mar 22 17:35:47 2017 +0300

----------------------------------------------------------------------
 .../org/apache/cayenne/gen/DataMapArtifact.java | 27 +++++----
 .../v1_2/client-datamap-singleclass.vm          | 54 +++++++++--------
 .../templates/v1_2/client-datamap-superclass.vm | 34 ++++++-----
 .../templates/v1_2/datamap-singleclass.vm       | 64 +++++++++++---------
 .../templates/v1_2/datamap-superclass.vm        | 38 ++++++------
 .../apache/cayenne/query/ProcedureQuery.java    |  8 +--
 docs/doc/src/main/resources/RELEASE-NOTES.txt   |  1 +
 7 files changed, 122 insertions(+), 104 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/c4e8ef89/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DataMapArtifact.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DataMapArtifact.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DataMapArtifact.java
index 8e60495..937f451 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DataMapArtifact.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DataMapArtifact.java
@@ -38,17 +38,14 @@ public class DataMapArtifact implements Artifact {
 
     protected DataMap dataMap;
     protected Collection<QueryDescriptor> selectQueries;
-    protected Collection<QueryDescriptor> sqlTemplateQueries;
-    protected Collection<QueryDescriptor> procedureQueries;
-    protected Collection<QueryDescriptor> ejbqlQueries;
+    protected Collection<QueryDescriptor> execQueries;
+
     protected Collection<String> queryNames;
 
     public DataMapArtifact(DataMap dataMap, Collection<QueryDescriptor> queries) {
         this.dataMap = dataMap;
         selectQueries = new LinkedList<>();
-        sqlTemplateQueries = new LinkedList<>();
-        procedureQueries = new LinkedList<>();
-        ejbqlQueries = new LinkedList<>();
+        execQueries = new LinkedList<>();
         queryNames = new LinkedList<>();
         addQueries(queries);
     }
@@ -99,14 +96,12 @@ public class DataMapArtifact implements Artifact {
             case QueryDescriptor.SELECT_QUERY:
                 selectQueries.add(query);
                 break;
+            // For now put all other queries to MappedExec list.
+            // Some additional flag could be introduced to control this explicitly.
             case QueryDescriptor.PROCEDURE_QUERY:
-                procedureQueries.add(query);
-                break;
             case QueryDescriptor.SQL_TEMPLATE:
-                sqlTemplateQueries.add(query);
-                break;
             case QueryDescriptor.EJBQL_QUERY:
-                ejbqlQueries.add(query);
+                execQueries.add(query);
                 break;
         }
 
@@ -119,8 +114,16 @@ public class DataMapArtifact implements Artifact {
         return selectQueries;
     }
 
+    public Collection<QueryDescriptor> getExecQueries() {
+        return execQueries;
+    }
+
     public boolean hasSelectQueries() {
-        return selectQueries.size() > 0;
+        return !selectQueries.isEmpty();
+    }
+
+    public boolean hasExecQueries() {
+        return !execQueries.isEmpty();
     }
 
     public boolean hasQueryNames() {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c4e8ef89/cayenne-cgen/src/main/resources/templates/v1_2/client-datamap-singleclass.vm
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/resources/templates/v1_2/client-datamap-singleclass.vm b/cayenne-cgen/src/main/resources/templates/v1_2/client-datamap-singleclass.vm
index d0c7f6c..a72fd39 100644
--- a/cayenne-cgen/src/main/resources/templates/v1_2/client-datamap-singleclass.vm
+++ b/cayenne-cgen/src/main/resources/templates/v1_2/client-datamap-singleclass.vm
@@ -36,16 +36,20 @@
 ${importUtils.setPackage($subPackageName)}##
 ${importUtils.addReservedType("${subPackageName}.${subClassName}")}##
 ${importUtils.addType("${basePackageName}.${baseClassName}")}##
-${importUtils.addType('java.util.List')}
-${importUtils.addType('java.util.Map')}
-${importUtils.addType('java.util.HashMap')}
-${importUtils.addType('org.apache.cayenne.ObjectContext')}
+${importUtils.addType('java.util.List')}##
+${importUtils.addType('org.apache.cayenne.ObjectContext')}##
+${importUtils.addType('org.apache.cayenne.query.MappedSelect')}##
 #foreach( $selectQuery in ${object.SelectQueries})
 ${importUtils.addType(${selectQuery.Root.ClassName})}
 #foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
 ${importUtils.addType(${dataMapUtils.getParameterType(${selectQuery}, ${parameter})})}
 #end
 #end
+#if($object.hasExecQueries())##
+${importUtils.addType('java.util.Map')}##
+${importUtils.addType('org.apache.cayenne.QueryResult')}##
+${importUtils.addType('org.apache.cayenne.query.MappedExec')}##
+#end##
 ${importUtils.generate()}
 
 /**
@@ -62,35 +66,33 @@ public class ${subClassName} {
 #end
 #end
 
-private static ${subClassName} instance;
+    private static ${subClassName} instance;
 
     private ${subClassName}() {}
 
-    public ${subClassName} getInstance() {
-      if( instance == null) {
-        instance = new ${subClassName}();
-      }
-      return instance;
+    public static ${subClassName} getInstance() {
+        if (instance == null) {
+            instance = new ${subClassName}();
+        }
+        return instance;
     }
 
 #foreach( $selectQuery in ${object.SelectQueries})
-    public List<${stringUtils.stripPackageName($selectQuery.Root.ClassName)}> perform${dataMapUtils.getQueryMethodName(${selectQuery})}(ObjectContext context #foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})}), ${stringUtils.stripPackageName(${dataMapUtils.getParameterType(${selectQuery}, ${parameter})})} ${parameter} #end) {
-    #if(${dataMapUtils.hasParameters($selectQuery)})
-      String[] parameters = new String[] {
-      #foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
-      "${parameter}",
-      #end
-      };
-
-      Object[] values = new Object[] {
-      #foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
-      ${parameter},
-      #end
-      };
-    #end
+#set($rootClass = ${stringUtils.stripPackageName($selectQuery.Root.ClassName)})
+    public List<$rootClass> perform${dataMapUtils.getQueryMethodName(${selectQuery})}(ObjectContext context#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})}), ${stringUtils.stripPackageName(${dataMapUtils.getParameterType(${selectQuery}, ${parameter})})} ${parameter}#end) {
+        MappedSelect<${rootClass}> query = MappedSelect.query(${stringUtils.capitalizedAsConstant(${selectQuery.Name})}_QUERYNAME, ${rootClass}.class);
+#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
+        query.param("${parameter}", ${parameter});
+#end
+        return query.select(context);
+    }
 
-      NamedQuery query = new NamedQuery("${selectQuery.Name}"#if(${dataMapUtils.hasParameters($selectQuery)}), parameters, values#end);
-      return context.performQuery(query);
+#end
+#foreach( $execQuery in ${object.ExecQueries})
+    public QueryResult<?> perform${dataMapUtils.getQueryMethodName(${execQuery})}(ObjectContext context, Map<String, ?> parameters) {
+        MappedExec query = MappedExec.query(${stringUtils.capitalizedAsConstant(${execQuery.Name})}_QUERYNAME).params(parameters);
+        return query.execute(context);
     }
+
 #end
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c4e8ef89/cayenne-cgen/src/main/resources/templates/v1_2/client-datamap-superclass.vm
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/resources/templates/v1_2/client-datamap-superclass.vm b/cayenne-cgen/src/main/resources/templates/v1_2/client-datamap-superclass.vm
index c196301..3c63a19 100644
--- a/cayenne-cgen/src/main/resources/templates/v1_2/client-datamap-superclass.vm
+++ b/cayenne-cgen/src/main/resources/templates/v1_2/client-datamap-superclass.vm
@@ -34,10 +34,10 @@
 ${importUtils.setPackage($superPackageName)}##
 #if(${superPackageName})${importUtils.addReservedType("${superPackageName}.${superClassName}")}#end##
 #if(${basePackageName})${importUtils.addType("${basePackageName}.${baseClassName}")}#end##
-#if( ${object.hasSelectQueries()} ) 
+#if( ${object.hasSelectQueries()} )
 ${importUtils.addType('java.util.List')}##
 ${importUtils.addType('org.apache.cayenne.ObjectContext')}##
-${importUtils.addType('org.apache.cayenne.query.NamedQuery')}##
+${importUtils.addType('org.apache.cayenne.query.MappedSelect')}##
 #foreach( $selectQuery in ${object.SelectQueries})
 ${importUtils.addType(${selectQuery.Root.ClientClassName})}##
 #foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
@@ -45,6 +45,11 @@ ${importUtils.addType(${dataMapUtils.getParameterType(${selectQuery}, ${paramete
 #end    
 #end
 #end
+#if($object.hasExecQueries())##
+${importUtils.addType('java.util.Map')}##
+${importUtils.addType('org.apache.cayenne.QueryResult')}##
+${importUtils.addType('org.apache.cayenne.query.MappedExec')}##
+#end##
 ${importUtils.generate()}
 
 /**
@@ -60,24 +65,23 @@ public class ${superClassName} {
     public static final String ${stringUtils.capitalizedAsConstant($qname)}_QUERYNAME = "$qname";
 #end
 #end
-#foreach( $selectQuery in ${object.SelectQueries})
-
-    public List<${stringUtils.stripPackageName($selectQuery.Root.ClientClassName)}> perform${dataMapUtils.getQueryMethodName(${selectQuery})}(ObjectContext context #foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})}), ${stringUtils.stripPackageName(${dataMapUtils.getParameterType(${selectQuery}, ${parameter})})} ${parameter}#end) {
-#if(${dataMapUtils.hasParameters($selectQuery)})
-        String[] parameters = {
-#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
-            "${parameter}",
-#end
-        };
 
-        Object[] values = {
+#foreach( $selectQuery in ${object.SelectQueries})
+#set($rootClass = ${stringUtils.stripPackageName($selectQuery.Root.ClassName)})
+    public List<$rootClass> perform${dataMapUtils.getQueryMethodName(${selectQuery})}(ObjectContext context#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})}), ${stringUtils.stripPackageName(${dataMapUtils.getParameterType(${selectQuery}, ${parameter})})} ${parameter}#end) {
+        MappedSelect<${rootClass}> query = MappedSelect.query(${stringUtils.capitalizedAsConstant(${selectQuery.Name})}_QUERYNAME, ${rootClass}.class);
 #foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
-            ${parameter},
+        query.param("${parameter}", ${parameter});
 #end
-        };
+        return query.select(context);
+    }
 
 #end
-        return context.performQuery(new NamedQuery("${selectQuery.Name}"#if(${dataMapUtils.hasParameters($selectQuery)}), parameters, values#end));
+#foreach( $execQuery in ${object.ExecQueries})
+    public QueryResult<?> perform${dataMapUtils.getQueryMethodName(${execQuery})}(ObjectContext context, Map<String, ?> parameters) {
+        MappedExec query = MappedExec.query(${stringUtils.capitalizedAsConstant(${execQuery.Name})}_QUERYNAME).params(parameters);
+        return query.execute(context);
     }
+
 #end
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c4e8ef89/cayenne-cgen/src/main/resources/templates/v1_2/datamap-singleclass.vm
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/resources/templates/v1_2/datamap-singleclass.vm b/cayenne-cgen/src/main/resources/templates/v1_2/datamap-singleclass.vm
index 9ad544c..52fcf17 100644
--- a/cayenne-cgen/src/main/resources/templates/v1_2/datamap-singleclass.vm
+++ b/cayenne-cgen/src/main/resources/templates/v1_2/datamap-singleclass.vm
@@ -36,16 +36,20 @@
 ${importUtils.setPackage($subPackageName)}##
 ${importUtils.addReservedType("${subPackageName}.${subClassName}")}##
 ${importUtils.addType("${basePackageName}.${baseClassName}")}##
-${importUtils.addType('java.util.List')}
-${importUtils.addType('java.util.Map')}
-${importUtils.addType('java.util.HashMap')}
-${importUtils.addType('org.apache.cayenne.ObjectContext')}
+${importUtils.addType('java.util.List')}##
+${importUtils.addType('org.apache.cayenne.ObjectContext')}##
+${importUtils.addType('org.apache.cayenne.query.MappedSelect')}##
 #foreach( $selectQuery in ${object.SelectQueries})
-${importUtils.addType(${selectQuery.Root.ClassName})}
+${importUtils.addType(${selectQuery.Root.ClassName})}##
 #foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
-${importUtils.addType(${dataMapUtils.getParameterType(${selectQuery}, ${parameter})})}
-#end
-#end
+${importUtils.addType(${dataMapUtils.getParameterType(${selectQuery}, ${parameter})})}##
+#end##
+#end##
+#if($object.hasExecQueries())##
+${importUtils.addType('java.util.Map')}##
+${importUtils.addType('org.apache.cayenne.QueryResult')}##
+${importUtils.addType('org.apache.cayenne.query.MappedExec')}##
+#end##
 ${importUtils.generate()}
 
 /**
@@ -58,7 +62,7 @@ public class ${subClassName} {
 #if( ${object.hasQueryNames()})
 #foreach( $qname in ${object.QueryNames})
 
-public static final String ${stringUtils.capitalizedAsConstant($qname)}_QUERYNAME = "$qname";
+    public static final String ${stringUtils.capitalizedAsConstant($qname)}_QUERYNAME = "$qname";
 #end
 #end
 
@@ -66,31 +70,31 @@ public static final String ${stringUtils.capitalizedAsConstant($qname)}_QUERYNAM
 
     private ${subClassName}() {}
 
-    public ${subClassName} getInstance() {
-      if( instance == null) {
-        instance = new ${subClassName}();
-      }
-      return instance;
+    public static ${subClassName} getInstance() {
+        if( instance == null) {
+            instance = new ${subClassName}();
+        }
+        return instance;
     }
 
 #foreach( $selectQuery in ${object.SelectQueries})
-    public List<${stringUtils.stripPackageName($selectQuery.Root.ClassName)}> perform${dataMapUtils.getQueryMethodName(${selectQuery})}(ObjectContext context #foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})}), ${stringUtils.stripPackageName(${dataMapUtils.getParameterType(${selectQuery}, ${parameter})})} ${parameter} #end) {
-    #if(${dataMapUtils.hasParameters($selectQuery)})
-      String[] parameters = new String[] {
-      #foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
-      "${parameter}",
-      #end
-      };
-
-      Object[] values = new Object[] {
-      #foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
-      ${parameter},
-      #end
-      };
-    #end
+#if(${dataMapUtils.isValidParameterNames($selectQuery)})
+    #set($rootClass = ${stringUtils.stripPackageName($selectQuery.Root.ClassName)})
+    public List<$rootClass> perform${dataMapUtils.getQueryMethodName(${selectQuery})}(ObjectContext context#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})}), ${stringUtils.stripPackageName(${dataMapUtils.getParameterType(${selectQuery}, ${parameter})})} ${parameter}#end) {
+        MappedSelect<${rootClass}> query = MappedSelect.query(${stringUtils.capitalizedAsConstant(${selectQuery.Name})}_QUERYNAME, ${rootClass}.class);
+#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
+        query.param("${parameter}", ${parameter});
+#end
+        return query.select(context);
+    }
 
-      NamedQuery query = new NamedQuery("${selectQuery.Name}"#if(${dataMapUtils.hasParameters($selectQuery)}), parameters, values#end);
-      return context.performQuery(query);
+#end
+#end
+#foreach( $execQuery in ${object.ExecQueries})
+    public QueryResult<?> perform${dataMapUtils.getQueryMethodName(${execQuery})}(ObjectContext context, Map<String, ?> parameters) {
+        MappedExec query = MappedExec.query(${stringUtils.capitalizedAsConstant(${execQuery.Name})}_QUERYNAME).params(parameters);
+        return query.execute(context);
     }
+
 #end
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c4e8ef89/cayenne-cgen/src/main/resources/templates/v1_2/datamap-superclass.vm
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/resources/templates/v1_2/datamap-superclass.vm b/cayenne-cgen/src/main/resources/templates/v1_2/datamap-superclass.vm
index 51c00f3..bea1a56 100644
--- a/cayenne-cgen/src/main/resources/templates/v1_2/datamap-superclass.vm
+++ b/cayenne-cgen/src/main/resources/templates/v1_2/datamap-superclass.vm
@@ -37,16 +37,21 @@ ${importUtils.setPackage($superPackageName)}##
 #if( ${object.hasSelectQueries()} )
 ${importUtils.addType('java.util.List')}##
 ${importUtils.addType('org.apache.cayenne.ObjectContext')}##
-${importUtils.addType('org.apache.cayenne.query.NamedQuery')}##
+${importUtils.addType('org.apache.cayenne.query.MappedSelect')}##
 #foreach( $selectQuery in ${object.SelectQueries})
 ${importUtils.addType(${selectQuery.Root.ClassName})}##
 #if(${dataMapUtils.isValidParameterNames($selectQuery)})
 #foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
 ${importUtils.addType(${dataMapUtils.getParameterType(${selectQuery}, ${parameter})})}##
-#end
-#end    
-#end
-#end
+#end##
+#end##
+#end##
+#end##
+#if($object.hasExecQueries())##
+${importUtils.addType('java.util.Map')}##
+${importUtils.addType('org.apache.cayenne.QueryResult')}##
+${importUtils.addType('org.apache.cayenne.query.MappedExec')}##
+#end##
 ${importUtils.generate()}
 
 /**
@@ -65,23 +70,22 @@ public class ${superClassName} {
 #foreach( $selectQuery in ${object.SelectQueries})
 
 #if(${dataMapUtils.isValidParameterNames($selectQuery)})
-    public List<${stringUtils.stripPackageName($selectQuery.Root.ClassName)}> perform${dataMapUtils.getQueryMethodName(${selectQuery})}(ObjectContext context #foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})}), ${stringUtils.stripPackageName(${dataMapUtils.getParameterType(${selectQuery}, ${parameter})})} ${parameter}#end) {
-#if(${dataMapUtils.hasParameters($selectQuery)})
-        String[] parameters = {
+    #set($rootClass = ${stringUtils.stripPackageName($selectQuery.Root.ClassName)})
+    public List<$rootClass> perform${dataMapUtils.getQueryMethodName(${selectQuery})}(ObjectContext context#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})}), ${stringUtils.stripPackageName(${dataMapUtils.getParameterType(${selectQuery}, ${parameter})})} ${parameter}#end) {
+        MappedSelect<${rootClass}> query = MappedSelect.query(${stringUtils.capitalizedAsConstant(${selectQuery.Name})}_QUERYNAME, ${rootClass}.class);
 #foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
-            "${parameter}",
+        query.param("${parameter}", ${parameter});
 #end
-        };
+        return query.select(context);
+    }
 
-        Object[] values = {
-#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
-            ${parameter},
 #end
-        };
-
 #end
-        return context.performQuery(new NamedQuery("${selectQuery.Name}"#if(${dataMapUtils.hasParameters($selectQuery)}), parameters, values#end));
+#foreach( $execQuery in ${object.ExecQueries})
+    public QueryResult<?> perform${dataMapUtils.getQueryMethodName(${execQuery})}(ObjectContext context, Map<String, ?> parameters) {
+        MappedExec query = MappedExec.query(${stringUtils.capitalizedAsConstant(${execQuery.Name})}_QUERYNAME).params(parameters);
+        return query.execute(context);
     }
-#end
+
 #end
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c4e8ef89/cayenne-server/src/main/java/org/apache/cayenne/query/ProcedureQuery.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/ProcedureQuery.java b/cayenne-server/src/main/java/org/apache/cayenne/query/ProcedureQuery.java
index 1a4738f..12ac3c7 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/ProcedureQuery.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/ProcedureQuery.java
@@ -36,8 +36,9 @@ import java.util.Map;
 /**
  * A query based on Procedure. Can be used as a select query, or as a query of an
  * arbitrary complexity, performing data modification, selecting data (possibly with
- * multiple result sets per call), returning values via OUT parameters. <h3>Execution with
- * DataContext</h3> <h4>Reading OUT parameters</h4>
+ * multiple result sets per call), returning values via OUT parameters.
+ * <h3>Execution with DataContext</h3>
+ * <h4>Reading OUT parameters</h4>
  * <p>
  * If a ProcedureQuery has OUT parameters, they are wrapped in a separate List in the
  * query result. Such list will contain a single Map with OUT parameter values.
@@ -72,8 +73,7 @@ public class ProcedureQuery extends AbstractQuery implements ParameterizedQuery,
 
     ProcedureQueryMetadata metaData = new ProcedureQueryMetadata();
 
-    // TODO: ColumnDescriptor is not XMLSerializable so we can't store
-    // it in a DataMap
+    // TODO: ColumnDescriptor is not XMLSerializable so we can't store it in a DataMap
     /**
      * @since 1.2
      */

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c4e8ef89/docs/doc/src/main/resources/RELEASE-NOTES.txt
----------------------------------------------------------------------
diff --git a/docs/doc/src/main/resources/RELEASE-NOTES.txt b/docs/doc/src/main/resources/RELEASE-NOTES.txt
index 197956b..7c2cd8b 100644
--- a/docs/doc/src/main/resources/RELEASE-NOTES.txt
+++ b/docs/doc/src/main/resources/RELEASE-NOTES.txt
@@ -19,6 +19,7 @@ CAY-2258 DI: type-safe binding of List and Map
 CAY-2266 Move EventBridge implementations into autoloadable modules
 CAY-2267 Contribute lifecycle events listeners via DI
 CAY-2259 QueryCache: support for referencing type-safe caches
+CAY-2261 Replace NamedQuery with MappedXYZ in *datamap.vm
 CAY-2268 DI: Refactor ListBuilder API ambiguities for before() / after() bindings
 CAY-2269 Add support for date/time components extraction in expression functions
 CAY-2270 Update function support in expression parser