Присоединение классов в ORMLite для Android вызывает SQL-исключение: не удалось найти иностранный класс или наоборот

Я пытаюсь создать запрос соединения с использованием QueryBuilder для двух разных классов: класса Product и класса storeId , который ссылается на атрибут Product, 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; } 

Мне нужно получить список storeId на основе продукта storeId .

 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(); } 

Этот запрос бросает SQL Exception:

 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) 

Исключение говорит о том, что мои классы не связаны посторонним полем, но класс Купона имеет атрибут Foreign Product, аннотированный должным образом. Я уже проверил базу данных, значения в таблицах верны.

Как я могу это исправить?

Просмотр кода внутри 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; } } 

Выше сказано, что если вы хотите сделать соединение с помощью QueryBuilder, вам нужно убедиться, что вы поместили поле join в поле id, так что мне кажется, что ограничение QueryBuilder.java в orm-lite. Если вы установили внешний ключ как id в Coupon.java Это сработало бы.

Быстрое обходное решение должно заключаться в использовании необработанной строки запроса для достижения желаемого.

Например –

 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());