Unirse a classs en ORMLite para Android arroja una exception SQL: no se pudo encontrar una class extranjera o viceversa

Intento crear una consulta de combinación usando QueryBuilder para dos classs diferentes, una class de Product y una class de Coupon , que hace reference a un atributo de Producto, el storeId .

 public class Coupon { @DatabaseField(columnName = TableColumns.PRODUCT, foreign = true, foreignColumnName = Product.TableColumns.STOREID) private Product product; } public class Product { @DatabaseField(columnName = TableColumns.ID, generatedId = true) private Integer id; @DatabaseField(columnName = TableColumns.STOREID, index = true, unique = true) private Integer storeId; } 

Necesito get una list de cupones basada en el storeId producto.

 public static List<Coupon> getByProduct(Product product) throws SQLException { QueryBuilder<Coupon, String> couponBuilder = dao.queryBuilder(); QueryBuilder<Product, Integer> productBuilder = Product.dao.queryBuilder(); productBuilder.where().eq(Product.TableColumns.STOREID, product.getStoreId()); return couponBuilder.join(productBuilder).query(); } 

Esta consulta arroja una exception SQL:

 04-22 11:26:08.058: W/System.err(19479): java.sql.SQLException: Could not find a foreign class com.cde.express.mccopa.model.Coupon field in class com.cde.express.mccopa.model.Product or vice versa 04-22 11:26:08.059: W/System.err(19479): at com.j256.ormlite.stmt.QueryBuilder.matchJoinedFields(QueryBuilder.java:554) 04-22 11:26:08.059: W/System.err(19479): at com.j256.ormlite.stmt.QueryBuilder.addJoinInfo(QueryBuilder.java:525) 04-22 11:26:08.059: W/System.err(19479): at com.j256.ormlite.stmt.QueryBuilder.join(QueryBuilder.java:316) 

La exception dice que mis classs no están relacionadas por un campo extranjero, pero la class de cupón tiene un atributo de Producto extranjero, anotado adecuadamente. Ya revisé la database, los valores en las tablas son correctos.

¿Cómo puedo arreglarlo?

Mirando el código dentro de QueryBuilder.java

  for (FieldType fieldType : tableInfo.getFieldTypes()) { // if this is a foreign field and its foreign-id field is the same as the other's id FieldType foreignIdField = fieldType.getForeignIdField(); if (fieldType.isForeign() && foreignIdField.equals(joinedQueryBuilder.tableInfo.getIdField())) { joinInfo.localField = fieldType; joinInfo.remoteField = foreignIdField; return; } } // if this other field is a foreign field and its foreign-id field is our id for (FieldType fieldType : joinedQueryBuilder.tableInfo.getFieldTypes()) { if (fieldType.isForeign() && fieldType.getForeignIdField().equals(idField)) { joinInfo.localField = idField; joinInfo.remoteField = fieldType; return; } } 

Arriba se indica que si desea hacer una combinación usando QueryBuilder, debe asegurarse de poner un join en el campo de id, así que esto me parece una limitación de QueryBuilder.java en orm-lite. Si ha escrito una key externa como id en Coupon.java Hubiera funcionado.

Una solución rápida debería ser utilizar una cadena de consulta sin formatting para lograr lo que desea.

Por ejemplo –

 final GenericRawResults<Coupon> results = couponDao.queryRaw("SELECT " + "product_table.product_id AS id, " + "product_table.store_id AS storeId " + " FROM coupon_table " + "JOIN product_table ON coupon_table.store_id = product_table.store_id " + "WHERE product_table.store_id = 1", new RawRowMapper<Coupon>() { @Override public Coupon mapRow(String[] columnNames, String[] resultColumns) throws SQLException { final Integer productId = Integer.parseInt(resultColumns[0]); final Integer storeId = Integer.parseInt(resultColumns[1]); final Product product = new Product(); product.setId(productId); product.setStoreId(storeId); final Coupon coupon = new Coupon(); coupon.setProduct(product); return coupon; } }); final Coupon coupon = results.getResults().get(0); final Product product = coupon.getProduct(); System.out.println("Product id is " + product.getId() + " , Store id is " + product.getStoreId());