{"id":2162,"date":"2016-02-10T12:33:50","date_gmt":"2016-02-10T12:33:49","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2162"},"modified":"2025-10-09T07:25:03","modified_gmt":"2025-10-09T14:25:03","slug":"spring-data-couchbase-2-0-release","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/spring-data-couchbase-2-0-release\/","title":{"rendered":"Lanzamiento de Spring Data Couchbase 2.0 RELEASE"},"content":{"rendered":"<p>Spring Data Couchbase 2.0 es una reescritura del conector Spring Data Couchbase 1.4.x original. Se basa en el SDK Java 2.2 de Couchbase y hace un uso intensivo del nuevo lenguaje de consulta N1QL (que se introdujo en Couchbase Server 4.0) para ofrecer m\u00e1s funciones a los usuarios de Spring Data.<\/p>\n<p>En <a href=\"https:\/\/www.couchbase.com\/blog\/es\/spring-data-couchbase-2.0-preview\/\">Primer hito<\/a> se public\u00f3 el pasado mes de agosto, a continuaci\u00f3n se lanz\u00f3 una versi\u00f3n candidata y, desde entonces, se han implementado nuevas funciones (y se han corregido errores).<\/p>\n<p>Hagamos un r\u00e1pido recorrido por lo que ha cambiado (con una notaci\u00f3n de \u2b50 a \u2b50\u2b50\u2b50 de lo impresionante y significativa que nos parece cada caracter\u00edstica...):<\/p>\n<h2 id=\"toc_0\">Novedades de Spring Data Couchbase 2.0<\/h2>\n<p>Las principales diferencias entre la generaci\u00f3n 1.x de <a href=\"https:\/\/docs.couchbase.com\/sdk-extensions\/spring-data-couchbase.html\">Spring Data Couchbase<\/a> y su versi\u00f3n 2.x son:<\/p>\n<ul>\n<li>Los elementos de configuraci\u00f3n se acercan m\u00e1s a la realidad de Couchbase: Entorno, Cluster, Bucket (permitiendo potencialmente crear <code>CouchbaseTemplate<\/code>s que se conectan cada uno a un bucket diferente, o incluso a clusters diferentes).<\/li>\n<li>La copia de seguridad de los m\u00e9todos de repositorio personalizados ya no se hace siempre con vistas, ahora se hace (por defecto) a trav\u00e9s de N1QL, que es mucho m\u00e1s flexible y requiere menos mantenimiento del lado del servidor.<\/li>\n<li>Los m\u00e9todos personalizados que utilizan vistas se han modificado un poco para ce\u00f1irse mejor a la filosof\u00eda de Spring Data. Esto reduce un poco la flexibilidad, pero las implementaciones se generan a partir del nombre del m\u00e9todo (mediante \"derivaci\u00f3n de consultas\").<\/li>\n<li>Ahora puede realizar consultas geoespaciales de sus datos (o consultas multidimensionales si va m\u00e1s all\u00e1 de las 3 dimensiones) con vistas.<\/li>\n<\/ul>\n<p>Por supuesto, puede seguir accediendo a la API de nivel inferior mediante la funci\u00f3n <code>CouchbaseTemplate<\/code> en lugar del <code>CouchbaseRepository<\/code> e incluso se puede acceder a la interfaz subyacente <code>Cubo<\/code> del SDK.<\/p>\n<h2 id=\"toc_1\">M\u00e9todos de repositorio a trav\u00e9s de N1QL<\/h2>\n<p>\u2b50\u2b50\u2b50<\/p>\n<p>La gran novedad de Couchbase 4.0 es <strong>N1QL<\/strong>, una extensi\u00f3n de SQL que funciona con documentos JSON (por lo que a\u00f1ad\u00eda a SQL especificidades relacionadas con JSON).<\/p>\n<p>Esto es especialmente bueno para los <code>Repositorio<\/code> y derivaci\u00f3n de consultas en Spring Data, porque la gran mayor\u00eda de las palabras clave de derivaci\u00f3n de consultas se pueden traducir f\u00e1cilmente a N1QL.<\/p>\n<p>N1QL es ahora la funci\u00f3n de respaldo por defecto de Couchbase para los m\u00e9todos de Repositorio. Tambi\u00e9n puede optar por utilizar la interfaz @Query si desea ser expl\u00edcito en la consulta ejecutada.<\/p>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-java\">public interface UserRepository extends Repository&lt;User, String&gt; {\r\n\r\n  User findByUsernameEquals(String username);\r\n\r\n  List findByUsernameContains(String contains);\r\n\r\n  @Query \/\/optional for N1QL query derivation but more explicit\r\n  List findByAgeBetween(int minAge, int maxAge);\r\n}<\/code><\/pre>\n<\/div>\n<h2 id=\"toc_2\">M\u00e9todos de repositorio a trav\u00e9s de Views<\/h2>\n<p>\u2b50\u2b50<\/p>\n<p>Un gran cambio en esta versi\u00f3n es que ahora, las consultas de repositorio (tambi\u00e9n conocidas como m\u00e9todos de repositorio personalizados) que se basan en vistas est\u00e1n m\u00e1s en l\u00ednea con la filosof\u00eda de Spring Data. Tambi\u00e9n tienen que ser anotados expl\u00edcitamente con <code>@View(viewName=\"algo\")<\/code>.<\/p>\n<p>Esto significa que nada espec\u00edfico de Couchbase deber\u00eda filtrarse en la interfaz de tu repositorio. En su lugar, lo que puedes hacer es utilizar mecanismos de derivaci\u00f3n de consultas para la mayor\u00eda de las consultas.<\/p>\n<p>La derivaci\u00f3n de consultas tambi\u00e9n es posible en peque\u00f1a medida, con la aceptaci\u00f3n de unas pocas palabras clave en un m\u00e9todo basado en vistas.<\/p>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-java\">public interface UserRepository extends Repository&lt;User, String&gt; {\r\n\r\n  @Override\r\n  @View(designDocument = \"user\", viewName = \"customFindAllView\")\r\n  Iterable findAll();\r\n\r\n  @View(viewName = \"customFindByNameView\")\r\n  User findByUsernameIs(String lowKey);\r\n\r\n  @View(viewName = \"customFindByNameView\")\r\n  List findByUsernameBetween(String lowKey, String highKey);\r\n}<\/code><\/pre>\n<\/div>\n<h2 id=\"toc_3\">Uso de la funci\u00f3n de reducci\u00f3n de Views<\/h2>\n<p>\u2b50<\/p>\n<p>Otra novedad que antes no se soportaba es la ejecuci\u00f3n de la funci\u00f3n reducir si se dispone de ella. Ahora, para ejecutarla, basta con establecer el par\u00e1metro <code>reducir<\/code> a true en el <code>Ver<\/code> anotaci\u00f3n.<\/p>\n<p>Tambi\u00e9n puede anteponer a su m\u00e9todo el prefijo \"count\" en lugar de \"find\" si le resulta \u00fatil (es decir, si realmente utiliza la funci\u00f3n de reducci\u00f3n \"count\").<\/p>\n<p>Tenga en cuenta que la funci\u00f3n de reducci\u00f3n en Couchbase puede ser algo diferente a la preexistente _count, e incluso podr\u00eda devolver algo diferente a un long como un <code>JsonObject<\/code>como por ejemplo <code>Estad\u00edsticas<\/code>.<\/p>\n<p>Del mismo modo, si se a\u00f1ade la variaci\u00f3n \"topX\" o \"firstX\" en el nombre de un m\u00e9todo, se establecer\u00e1 un l\u00edmite adicional en la solicitud (por ejemplo. <code>findFirst5ByLastName<\/code> limitar\u00e1 la lista a 5 resultados).<\/p>\n<h2 id=\"toc_4\">Configurar la coherencia, leer sus propios escritos<\/h2>\n<p>\u2b50\u2b50\u2b50<\/p>\n<p>Una cosa que surge a menudo cuando se utilizan \u00edndices secundarios poblados as\u00edncronamente como vistas y GSI (el nuevo motor de \u00edndice secundario que respalda a N1QL), es la necesidad de leer inmediatamente las modificaciones de sus operaciones de escritura anteriores.<\/p>\n<p>Esto implica que la vista\/N1QL no debe responder mientras los datos est\u00e9n a\u00fan en proceso de indexaci\u00f3n, por lo que se sacrifica algo de rendimiento en favor de la consistencia.<\/p>\n<p>Lo contrario (y por defecto en Spring Data Couchbase) es favorecer el rendimiento aceptando que se devuelvan datos obsoletos.<\/p>\n<p>Hemos a\u00f1adido una sem\u00e1ntica global para configurar todas las consultas (basadas en vistas o en N1QL) que son construidas por el framework a trav\u00e9s de la derivaci\u00f3n de consultas, proporcionando una peque\u00f1a abstracci\u00f3n en torno al concepto de Consistencia.<\/p>\n<p>Esto se hace anulando la funci\u00f3n <code>AbstractCouchbaseConfiguration<\/code>'s <code>getDefaultConsistency()<\/code> m\u00e9todo. <code>Coherencia<\/code> es un enum que permite elegir entre <code>LEER_ESCRITURAS_PROPIAS<\/code>, <code>FUERTEMENTE_CONSISTENTE<\/code>, <code>UPDATE_AFTER<\/code> y <code>EVENTUALMENTE_CONSISTENTE<\/code>. Consulte la documentaci\u00f3n oficial para obtener m\u00e1s informaci\u00f3n sobre c\u00f3mo funcionan exactamente y cu\u00e1l es su impacto en el momento de la consulta.<\/p>\n<p>Tambi\u00e9n puede hacerlo en XML utilizando el atributo de coherencia en la variable <code><\/code> etiqueta.<\/p>\n<p>Desde GA, los m\u00e9todos CRUD en repositorios ahora tambi\u00e9n tienen en cuenta la consistencia configurada por defecto.<\/p>\n<h2 id=\"toc_5\">Modificaci\u00f3n del campo de informaci\u00f3n de tipo en JSON almacenado<\/h2>\n<p>\u2b50<\/p>\n<p>Algunos usuarios han informado de problemas con Spring Data y la parte de Couchbase Mobile, con la puerta de enlace de sincronizaci\u00f3n rechazando documentos que contienen campos prefijados por un gui\u00f3n bajo.<\/p>\n<p>Esto es problem\u00e1tico para Spring Data, ya que por defecto almacena la informaci\u00f3n de tipo en un archivo <code>Clase<\/code> campo :(<\/p>\n<p>La soluci\u00f3n es permitir, a trav\u00e9s de la configuraci\u00f3n, modificar el nombre de ese campo de informaci\u00f3n de tipo. Puede hacerlo anulando la directiva <code>typeKey()<\/code> m\u00e9todo en <code>AbstractCouchbaseConfiguration<\/code>. Por ejemplo, puede utilizar la constante <code>MappingCouchbaseConverter.TYPEKEY_SYNCGATEWAY_COMPATIBLE<\/code> (que es \"<code>javaClass<\/code>&#8220;).<\/p>\n<p>Este campo es el que utilizan las consultas N1QL generadas para filtrar s\u00f3lo los documentos correspondientes a la entidad del repositorio.<\/p>\n<h2 id=\"toc_6\">Apoyo a <code>Pageable<\/code>\/<code>Petici\u00f3n de p\u00e1gina<\/code> en las consultas derivadas de N1QL<\/h2>\n<p>\u2b50\u2b50<\/p>\n<p>Utilizando N1QL, para consultas que se generan a trav\u00e9s de la derivaci\u00f3n de consultas, <code>Pageable<\/code> y <code>Ordenar<\/code> ahora son compatibles.<\/p>\n<ul>\n<li>Apoyo a <code>PagingAndSortingRepository<\/code> basado en N1QL.<\/li>\n<li>A\u00f1ade dos <code>findAll<\/code> que dependen de N1QL para la paginaci\u00f3n y\/o la ordenaci\u00f3n. Utiliza la coherencia configurada por defecto.<\/li>\n<\/ul>\n<h2 id=\"toc_7\">Consultas geoespaciales y multidimensionales mediante vistas espaciales<\/h2>\n<p>\u2b50\u2b50\u2b50<\/p>\n<p>Consulta Couchbase usando coordenadas Siempre que su entidad tenga un <code>Punto<\/code> (o <code>x<\/code> y <code>y<\/code>), puede encontrarlo utilizando<\/p>\n<ul>\n<li>un cuadro delimitador: <code>findByLocationWithin(Caja \u00e1rea)<\/code><\/li>\n<li>un c\u00edrculo: <code>findByLocationWithin(C\u00edrculo \u00e1rea)<\/code>, <code>findByLocationWithin(Punto centro, Distancia radio)<\/code>.<\/li>\n<li>un pol\u00edgono: <code>findByLocationWithin(Pol\u00edgono \u00e1rea)<\/code>, <code>findByLocationWithin(Punto[] pol\u00edgono)<\/code>.<\/li>\n<li>a distancia <code>findByLocationNear(Punto cercano, Distancia maxDistancia)<\/code>.<\/li>\n<\/ul>\n<p>Las consultas sobre c\u00edrculos y pol\u00edgonos se realizan r\u00e1pidamente en el servidor como aproximaciones de cajas delimitadoras y, a continuaci\u00f3n, el marco elimina los falsos positivos antes de presentar los resultados.<\/p>\n<p>Puede aprovechar el aspecto multidimensional de Couchbase Spatial Views para a\u00f1adir dimensiones adicionales a sus consultas (por ejemplo, tiendas que abren tarde por la noche dentro de una ciudad...).<\/p>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-java\">public interface DimensionalPartyRepository extends CrudRepository&lt;Party, String&gt; {\r\n\r\n  @Dimensional(designDocument = \"partyGeo\", spatialViewName = \"byLocation\")\r\n  List findByLocationNear(Point p, Distance d);\r\n\r\n  @Dimensional(designDocument = \"partyGeo\", spatialViewName = \"byLocation\")\r\n  List findByLocationWithin(Box boundingBox);\r\n\r\n  @Dimensional(designDocument = \"partyGeo\", spatialViewName = \"byLocation\")\r\n  List findByLocationWithin(Polygon zone);\r\n  \r\n  @Dimensional(designDocument = \"partyGeo\", spatialViewName = \"byLocationAndAttendees\", dimensions = 3)\r\n  List findByLocationWithinAndAttendeesGreaterThan(Polygon zone, double minAttendees);\r\n}<\/code><\/pre>\n<\/div>\n<p>Nota: si desea reutilizar las anotaciones, tambi\u00e9n puede hacerlo (funciona para <code>Ver<\/code> y <code>@Query<\/code> tambi\u00e9n):<\/p>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-java\">public interface DimensionalPartyRepository extends CrudRepository&lt;Party, String&gt; {\r\n\r\n  \/\/define your own meta-annotation\r\n  @Dimensional(designDocument = \"partyGeo\", spatialViewName = \"byLocation\", dimensions = 2)\r\n  @Retention(RetentionPolicy.RUNTIME)\r\n  @interface IndexedByLocation { }\r\n  \r\n  \/\/use it :)\r\n  @IndexedByLocation\r\n  List findByLocationNear(Point p, Distance d);\r\n\r\n  @IndexedByLocation\r\n  List findByLocationWithin(Box boundingBox);\r\n\r\n  @IndexedByLocation\r\n  List findByLocationWithin(Polygon zone);\r\n  \r\n  \/\/here we use a variation with 3 dimensions, so we need to revert to @Dimensional\r\n  @Dimensional(designDocument = \"partyGeo\", spatialViewName = \"byLocationAndAttendees\", dimensions = 3)\r\n  List findByLocationWithinAndAttendeesGreaterThan(Polygon zone, double minAttendees);\r\n}<\/code><\/pre>\n<\/div>\n<h2 id=\"toc_8\">En l\u00ednea <code>N1QL<\/code> <code>@Query<\/code> ahora son compatibles con SpEL<\/h2>\n<p>\u2b50\u2b50\u2b50<\/p>\n<p>Las consultas en l\u00ednea pueden utilizar la notaci\u00f3n SpEL para:<\/p>\n<ol>\n<li>asegurarse de que se aplica la selecci\u00f3n y el filtrado correctos a la sentencia para construir y devolver entidades: utilizar <code>#{#n1ql.selectEntity}<\/code> para generar un <code>SELECT ... FROM ...<\/code> y <code>#{#n1ql.filter}<\/code> en el <code>DONDE<\/code> para limitar la consulta a la entidad correcta.<\/li>\n<li>calcular valores o recuperar datos de proveedores de valores SpEL externos configurados en el contexto de Spring.<\/li>\n<\/ol>\n<h2 id=\"toc_9\">La creaci\u00f3n de \u00edndices \"principales\" del repositorio puede activarse autom\u00e1ticamente<\/h2>\n<p>\u2b50\u2b50<\/p>\n<p>\u26a0\ufe0f <strong><em>IMPORTANTE: esto se considera una ayuda durante el desarrollo\/pruebas y se desaconseja en producci\u00f3n.<\/em><\/strong><\/p>\n<p>Para asegurarse de que la indexaci\u00f3n N1QL de las entidades de un repositorio determinado est\u00e1 activada en un entorno de desarrollo o preproducci\u00f3n, se puede anotar con <code>@N1qlPrimaryIndexed<\/code> (que permite realizar consultas de forma libre en todo el bucket) y <code>@N1qlSecondaryIndexed<\/code> (que indexar\u00e1 s\u00f3lo los documentos correspondientes al tipo de entidad, de forma similar a la cl\u00e1usula WHERE producida por SpEL <code>#{#n1ql.filter}<\/code>).<\/p>\n<p>Adem\u00e1s, la vista de respaldo para la operaci\u00f3n CRUD puede crearse autom\u00e1ticamente anotando el repositorio con <code>@VerIndexado<\/code> (tendr\u00e1 que proporcionar el nombre del documento de dise\u00f1o, que debe corresponder al nombre de clase simple de la entidad con la primera letra en min\u00fascula).<\/p>\n<p>Esta funci\u00f3n debe activarse adicionalmente redefiniendo el campo <code>indexManager<\/code> jud\u00eda en el <code>AbstractCouchbaseConfiguration<\/code>.<\/p>\n<h2 id=\"toc_10\">Tipos de retorno simples (primitivos y <code>Cadena<\/code>) cuando se utiliza una proyecci\u00f3n de una sola fila<\/h2>\n<p>\u2b50\u2b50<\/p>\n<p>Esto est\u00e1 especialmente dirigido a las consultas N1QL en l\u00ednea con funciones de agregaci\u00f3n como <code>CONTAR(*)<\/code>, <code>AVG(campo)<\/code>La consulta debe devolver una \u00fanica fila con una \u00fanica proyecci\u00f3n.<\/p>\n<h2 id=\"toc_11\">Soporte de par\u00e1metros con nombre en las consultas en l\u00ednea N1QL<\/h2>\n<p>\u2b50\u2b50<\/p>\n<p>Utilice par\u00e1metros con nombre o par\u00e1metros posicionales, pero no ambos. La sintaxis de los par\u00e1metros con nombre es <code>$paramName<\/code>que requiere que cada par\u00e1metro del m\u00e9todo se anote con <code>@Param(\"paramNombre\")<\/code>.<\/p>\n<h2 id=\"toc_12\">Otras caracter\u00edsticas<\/h2>\n<p>\u2b50<\/p>\n<p>Otras caracter\u00edsticas son:<\/p>\n<ul>\n<li>Arreglar la nomenclatura de los beans para que todos los beans creados por Spring Data Couchbase lleven el prefijo \"<code>couchbase<\/code>\", para evitar enfrentamientos con otras tiendas.<\/li>\n<li>Ahora es posible cambiar la clase base de todos los repositorios (siguiendo el proceso documentado en la documentaci\u00f3n com\u00fan de Spring Data).<\/li>\n<li>En caso de que los \u00edndices est\u00e9n obsoletos, los documentos borrados se eliminan de los m\u00e9todos de b\u00fasqueda en el archivo <code>CouchbaseTemplate<\/code><\/li>\n<li>La caducidad puede fijarse en un <code>@Documento<\/code>como <code>largo<\/code> + <code>timeUnit<\/code><\/li>\n<\/ul>\n<p>Tambi\u00e9n se han implementado algunas correcciones de errores y mejoras con respecto a la RC1.<\/p>\n<h2 id=\"toc_13\">Documentaci\u00f3n<\/h2>\n<p>\u2b50\u2b50\u2b50<\/p>\n<p><a href=\"https:\/\/docs.spring.io\/spring-data\/couchbase\/docs\/2.0.0.RELEASE\/reference\/html\/\">Documentaci\u00f3n<\/a> tambi\u00e9n se ha mejorado, a\u00f1adiendo ejemplos orientados a Couchbase sobre c\u00f3mo a\u00f1adir la implementaci\u00f3n de un m\u00e9todo personalizado a un repositorio, c\u00f3mo cambiar la clase base de todos los repositorios, c\u00f3mo tratar con SpEL en consultas en l\u00ednea, ...<\/p>\n<h2 id=\"toc_14\">Nota sobre Spring Cache<\/h2>\n<p>En <a href=\"https:\/\/www.couchbase.com\/blog\/es\/couchbase-spring-cache\/\">Cach\u00e9 de primavera<\/a> ha salido del repositorio de Spring Data. Todav\u00eda est\u00e1 ah\u00ed y planeamos mejorarlo. Por ahora puedes encontrarlo en Couchbase <a href=\"https:\/\/github.com\/couchbaselabs\/couchbase-spring-cache\">repositorio<\/a> en github pero pronto deber\u00eda reintegrarse a la familia oficial de proyectos Spring.<\/p>\n<h2 id=\"toc_15\">Obtener Spring Data Couchbase<\/h2>\n<p>Puede a\u00f1adir lo siguiente a su proyecto <code>pom.xml<\/code> para obtener esta versi\u00f3n GA (en el <code>dependencias<\/code> secci\u00f3n:<\/p>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-markup\">&lt;!----&gt;\r\n  \r\n    org.springframework.data\r\n    spring-data-couchbase\r\n    2.0.0.RELEASE\r\n  \r\n&lt;!----&gt;<\/code><\/pre>\n<\/div>\n<p>Esperamos que disfrute de esta versi\u00f3n y de todas las novedades que aporta. El siguiente paso ser\u00e1 volver a conectar con el <code>Tolva<\/code> tren de liberaci\u00f3n con una versi\u00f3n <code>2.1<\/code> antes del verano.<\/p>","protected":false},"excerpt":{"rendered":"<p>Spring Data Couchbase 2.0 is a rewrite of the original Spring Data Couchbase 1.4.x connector. It is based on the Couchbase Java 2.2 SDK and makes heavy use of the new query language N1QL (which was introduced in Couchbase Server [&hellip;]<\/p>","protected":false},"author":48,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1818],"tags":[1424,1465],"ppma_author":[9022],"class_list":["post-2162","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java","tag-spring","tag-spring-data"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.1 (Yoast SEO v26.1.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Announcing Spring Data Couchbase 2.0 RELEASE - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/spring-data-couchbase-2-0-release\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Announcing Spring Data Couchbase 2.0 RELEASE\" \/>\n<meta property=\"og:description\" content=\"Spring Data Couchbase 2.0 is a rewrite of the original Spring Data Couchbase 1.4.x connector. It is based on the Couchbase Java 2.2 SDK and makes heavy use of the new query language N1QL (which was introduced in Couchbase Server [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/spring-data-couchbase-2-0-release\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-02-10T12:33:49+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-09T14:25:03+00:00\" \/>\n<meta name=\"author\" content=\"Simon Basle, Software Engineer, Pivotal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Simon Basle, Software Engineer, Pivotal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/\"},\"author\":{\"name\":\"Simon Basle, Software Engineer, Pivotal\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/a4086d75b59570cc2e5ff66d98c5d1a1\"},\"headline\":\"Announcing Spring Data Couchbase 2.0 RELEASE\",\"datePublished\":\"2016-02-10T12:33:49+00:00\",\"dateModified\":\"2025-10-09T14:25:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/\"},\"wordCount\":1505,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"spring\",\"spring-data\"],\"articleSection\":[\"Java\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/\",\"name\":\"Announcing Spring Data Couchbase 2.0 RELEASE - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2016-02-10T12:33:49+00:00\",\"dateModified\":\"2025-10-09T14:25:03+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Announcing Spring Data Couchbase 2.0 RELEASE\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/a4086d75b59570cc2e5ff66d98c5d1a1\",\"name\":\"Simon Basle, Software Engineer, Pivotal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4b2bcd169f85f21cee7b8a0e0c9e7854\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g\",\"caption\":\"Simon Basle, Software Engineer, Pivotal\"},\"description\":\"Simon Basl_ is a Paris-based Software Engineer working in the Spring team at Pivotal. Previously, he worked in the Couchbase Java SDK team. His interests span software design aspects (OOP, design patterns, software architecture), rich clients, what lies beyond code (continuous integration, (D)VCS, best practices), and reactive programming. He is also an editor for the French version of InfoQ.com.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/simon-basle\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Announcing Spring Data Couchbase 2.0 RELEASE - The Couchbase Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/es\/spring-data-couchbase-2-0-release\/","og_locale":"es_MX","og_type":"article","og_title":"Announcing Spring Data Couchbase 2.0 RELEASE","og_description":"Spring Data Couchbase 2.0 is a rewrite of the original Spring Data Couchbase 1.4.x connector. It is based on the Couchbase Java 2.2 SDK and makes heavy use of the new query language N1QL (which was introduced in Couchbase Server [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/es\/spring-data-couchbase-2-0-release\/","og_site_name":"The Couchbase Blog","article_published_time":"2016-02-10T12:33:49+00:00","article_modified_time":"2025-10-09T14:25:03+00:00","author":"Simon Basle, Software Engineer, Pivotal","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Simon Basle, Software Engineer, Pivotal","Est. reading time":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/"},"author":{"name":"Simon Basle, Software Engineer, Pivotal","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/a4086d75b59570cc2e5ff66d98c5d1a1"},"headline":"Announcing Spring Data Couchbase 2.0 RELEASE","datePublished":"2016-02-10T12:33:49+00:00","dateModified":"2025-10-09T14:25:03+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/"},"wordCount":1505,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["spring","spring-data"],"articleSection":["Java"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/","url":"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/","name":"Announcing Spring Data Couchbase 2.0 RELEASE - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2016-02-10T12:33:49+00:00","dateModified":"2025-10-09T14:25:03+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Announcing Spring Data Couchbase 2.0 RELEASE"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/a4086d75b59570cc2e5ff66d98c5d1a1","name":"Simon Basle, Ingeniero de Software, Pivotal","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4b2bcd169f85f21cee7b8a0e0c9e7854","url":"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g","caption":"Simon Basle, Software Engineer, Pivotal"},"description":"Simon Basl_ es un Ingeniero de Software residente en Par\u00eds que trabaja en el equipo Spring de Pivotal. Anteriormente, trabaj\u00f3 en el equipo de Couchbase Java SDK. Sus intereses abarcan aspectos de dise\u00f1o de software (OOP, patrones de dise\u00f1o, arquitectura de software), clientes ricos, lo que hay m\u00e1s all\u00e1 del c\u00f3digo (integraci\u00f3n continua, (D)VCS, mejores pr\u00e1cticas) y programaci\u00f3n reactiva. Tambi\u00e9n es editor de la versi\u00f3n francesa de InfoQ.com.","url":"https:\/\/www.couchbase.com\/blog\/es\/author\/simon-basle\/"}]}},"authors":[{"term_id":9022,"user_id":48,"is_guest":0,"slug":"simon-basle","display_name":"Simon Basle, Software Engineer, Pivotal","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g","author_category":"","last_name":"Basle","first_name":"Simon","job_title":"","user_url":"","description":"Simon Basl_ es un Ingeniero de Software residente en Par\u00eds que trabaja en el equipo Spring de Pivotal. Anteriormente, trabaj\u00f3 en el equipo de Couchbase Java SDK. Sus intereses abarcan aspectos de dise\u00f1o de software (OOP, patrones de dise\u00f1o, arquitectura de software), clientes ricos, lo que hay m\u00e1s all\u00e1 del c\u00f3digo (integraci\u00f3n continua, (D)VCS, mejores pr\u00e1cticas) y programaci\u00f3n reactiva. Tambi\u00e9n es editor de la versi\u00f3n francesa de InfoQ.com."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2162","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/48"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=2162"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2162\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=2162"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=2162"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=2162"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=2162"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}