2012-07-26 10 views
7

Utilizando ORMLite para Android, necesito crear una consulta que devuelva las órdenes por ID de pedido o por nombre de cliente. Por favor considere las siguientes declaraciones de clase:ORMLite - Campo extranjero de consulta

@DatabaseTable(tableName = "order") 
public class Order { 
    @DatabaseField(generatedId = true) 
    private Long id; 

    @DatabaseField(foreign = true, canBeNull = false, foreignAutoRefresh = true, columnName = "customer_id") 
    private Customer customer; 

    // default constructor, getters and setters... 
} 

@DatabaseTable(tableName = "customer") 
public class Customer { 
    @DatabaseField(generatedId = true) 
    private Long id; 

    @DatabaseField 
    private String name; 

    // default constructor, getters and setters... 
} 

El SQL prima Busco sería algo como esto:

SELECT 
    o.* 
FROM 
    order o 
    JOIN customer c on 
     o.customer_id = c.id 
WHERE 
    (o.id = ?) OR (c.name = ?) 

¿Cuál es la mejor manera de hacer esto utilizando ORMLite?

+0

http://stackoverflow.com/questions/17618198/error-in-query-with-join-with-ormlite Por favor, me ayudan: (@Gray – fabiodresch

Respuesta

12

ORMLite ahora soporta simple join queries.

Así que la consulta sería algo como:

QueryBuilder<Customer, Integer> customerQb = customerDao.queryBuilder(); 
SelectArg nameSelectArg = new SelectArg(); 
// this gives the c.name = ? 
customerQb.where().eq("name", nameSelectArg); 
QueryBuilder<Account, Integer> orderQb = orderDao.queryBuilder(); 
SelectArg idSelectArg = new SelectArg(); 
// this gives the o.id = ? 
orderQb.where().eq("id", idSelectArg); 
orderQb.join(customerQb); 
// then you set the args and run the query 
nameSelectArg.setValue("jim"); 
idSelectArg.setValue(1); 
List<Order> results = orderQb.join(customerQb).query(); 
+0

Gray, acabamos de ver OrmLite como un ORM potencial en Android, y notamos que las relaciones se cargan a través de consultas separadas en lugar de uniones, sufriendo así el problema N + 1. ¿Cuál fue la razón detrás de implementarlo de esa manera? Actualmente significa que 'queryForAll' en 100' A's que cada uno tiene una 'B' emitirá 101 consultas en lugar de una. 1 consulta para obtener todos los 'A's, luego otras 100 consultas para buscar' B' para cada 'A'. – Matthias

+0

La respuesta corta es porque no es ORMHeavy @Matthias. Algunas personas se quejan de su tamaño de código y de algunas de sus características que faltan ... – Gray

+0

Muy bien. Aunque creo que es una omisión extraña cuando hay tantas otras características. Este es un anti patrón común y, creo, algo que derrota su propio propósito, ya que requiere que el cliente realice el mapeo a menos que quiera tragarse el costo adicional de esto (que es grande y crece con el tamaño de la tabla) – Matthias

0

No, se une están soportados en ORMLite https://stackoverflow.com/a/7320091/323128 Sin embargo, this reference dará una visión de cómo completar su tarea

+0

Estoy bien trabajando con consultas crudas en ese caso. ¿Es posible obtener una Lista desde una consulta sin formato? ¿O puedo trabajar solo con GenericRawResults? – itmartins

+0

DOC: los métodos queryRaw devuelven un objeto GenericRawResults que representa un El resultado es una matriz de cadenas, una matriz de objetos o objetos asignados por el usuario. Entonces, puede crear un objeto de composición que mapeará en su resultado para obtener datos de algún tipo. de contenedor mejor que una serie de cadenas – Maxim

+0

Gracias Maxim, has sido muy útil. Sin embargo, mi clase de orden real tiene más de 20 atributos, lo que hace que sea muy laborioso mapear cada atributo para obtener un objeto Order. – itmartins

Cuestiones relacionadas