2010-01-15 22 views
10

Necesito implementar un patrón de objeto de consulta en Java para mi interfaz de búsqueda personalizable (de una aplicación de Internet que estoy escribiendo).Patrón de objeto de consulta (patrón de diseño)

¿Alguien sabe dónde puedo obtener un ejemplo/tutorial de Query Object Pattern (QoP de Martin Fowler)?

Gracias de antemano

ADEMÁS cómo agregar un patrón de consulta a un patrón DAO existentes?

+0

Note que Hibernate tiene un buen API Criteria (JPA 2.0 también tiene una API criterios typesafe ahora). –

+0

Lo que estoy reuniendo es que debería mudarme a Hibernate. –

+0

Pregunta similar - http://stackoverflow.com/questions/2265290/query-object-implementation-examples – JamesG

Respuesta

10

La palabra "patrón" en el "Patrón de objeto de consulta" está (en mi humilde posición) fuera de lugar. No es un patrón de diseño real. El "Objeto de consulta" es solo otro ejemplo del Interpreter Pattern. El legado Hibernate Criteria API y el moderno JPA2 Criteria API son excelentes ejemplos que lo combinan con el Builder Pattern.

cuanto a su pregunta:

cómo agregar un patrón de consulta a un patrón DAO existente?

Recomendaría echar un vistazo a JPA2.

3

de objetos de consulta

un objeto que representa una consulta de base de datos.

Para una descripción completa ver here

SQL puede ser una lengua en cuestión, y muchos desarrolladores no están particularmente familiarizados con ella. Además, necesita saber cómo se ve el esquema de la base de datos para crear consultas. Puede evitar esto creando métodos de búsqueda especializados que oculten el SQL dentro de métodos parametrizados, pero eso dificulta la creación de consultas más ad-hoc. También conduce a la duplicación en las sentencias de SQL si el esquema de la base de datos cambia.

Un objeto de consulta es un intérprete [Grupo de cuatro], es decir, una estructura de objetos que puede formarse en una consulta SQL. Puede crear esta consulta consultando clases y campos en lugar de tablas y columnas. De esta forma, quienes escriben las consultas pueden hacerlo independientemente del esquema de la base de datos y los cambios en el esquema pueden ser localizados en un solo lugar.

+1

Has malentendido mi pregunta. Conozco el patrón Query Object y sé que fue descrito en el libro de Martin Fowler. Quería ver el patrón de diseño utilizado para Query Object. –

2

Escribí una implementación de C# para NHibernate aquí: https://github.com/shaynevanasperen/NHibernate.Sessions.Operations.

Funciona mediante el uso de una interfaz de esta manera:

public interface IDatabases 
{ 
    ISessionManager SessionManager { get; } 

    T Query<T>(IDatabaseQuery<T> query); 
    T Query<T>(ICachedDatabaseQuery<T> query); 

    void Command(IDatabaseCommand command); 
    T Command<T>(IDatabaseCommand<T> command); 
} 

Dada una clase de entidad POCO así:

class Database1Poco 
{ 
    public int Property1 { get; set; } 
    public string Property2 { get; set; } 
} 

usted puede construir Objetos de la consulta como esta:

class Database1PocoByProperty1 : DatabaseQuery<Database1Poco> 
{ 
    public override Database1Poco Execute(ISessionManager sessionManager) 
    { 
     return sessionManager.Session.Query<Database1Poco>().SingleOrDefault(x => x.Property1 == Property1); 
    } 

    public int Property1 { get; set; } 
} 

Y luego utilícelos así:

var database1Poco = _databases.Query(new Database1PocoByProperty1 { Property1 = 1 }); 

Puede portar eso a Java si lo desea.

Éstos son algunos otros ejemplos:

https://lostechies.com/jimmybogard/2012/10/08/favor-query-objects-over-repositories/ http://www.mrdustpan.com/command-query-objects-with-dapper#disqus_thread http://crosscuttingconcerns.com/CommandQuery-Object-pattern

+0

¿No debería ser esto un comentario? –

+0

No lo creo. Responde directamente a la pregunta proporcionando un código de ejemplo. – Shayne