¿Qué clases en Spring Data puedo extender/anular para que la cláusula where incluya las clases que heredan la entidad/modelo base?
Elaborar....
Aquí hay algunos modelos que se extienden desde una clase de actividad "base":
@Document public abstract class Activity { } @Document public class CommentActivity extends Activity { } @Document public class ShareActivity extends Activity { }
Al guardar estos modelos, estoy usando una sola clase de repositorio como se define a continuación con un método "findBy":
@Repository("activityRepository") public interface Activity extends CouchbaseRepository<Activity, String>, CouchbaseRepositoryCustom<Activity, String> { Page<Activity> findByPersonId(String personId, Pageable pageable); } // saving a model in my application would be like so activityRepository.save(new CommentActivity());
Al recuperar esto de Couchbase, la estructura se devuelve así:
{ "_CAS": 123234342354345, "_ID": "0001", "_class": "com.myproject.models.CommentActivity", "comment": "yo", "dateCreated": 1400000000000, "dateUpdated": 1400000000000, "personId": "0001" }
El proyecto utiliza Spring Data Couchbase 2.2.0.RELEASE. Según la interfaz de repositorio anterior, llamar al método findByPersonId generaría automáticamente una consulta que solo contiene la clase base en la cláusula where.
WHERE (`personId` = "0001") AND `_class` = "com.myproject.models.Activity"
En mi caso, me gustaría incluir todos los tipos que se extienden desde Actividad de esta manera:
WHERE (`_class` = "com.myproject.models.Activity" OR `_class` = "com.myproject.models.UpdatedActivity" OR `_class` = "com.myproject.models.StatusChangedActivity") AND personId = "0001"
Puede definir su propia cadena de consulta, como
@Query("#{#n1ql.selectEntity} WHERE personId = ${'$'}personId AND (_class='com.myproject.models.UpdatedActivity' OR _class='com.myproject.models.StatusChangedActivity'") fun findByPersonId(@Param("personId") personId: String): List<Activity>
El código anterior está en Kotlin, pero supongo que se adapta fácilmente a Java.
Tenga en cuenta que tuve que agregar @N1qlPrimaryIndexed
a la clase de repositorio.