我在我的Android应用程序中使用ORM Lite,我有一个问题是通过过滤外国字段进行搜索,我将在下面发布我的课程:
public class Estabelecimento {
@DatabaseField(generatedId = true)
private int id;
@DatabaseField
public static long codigo;
@ForeignCollectionField(eager=false)
private Collection<SituacaoProduto> situacoesProduto;
...
}
public class SituacaoProduto {
@DatabaseField(generatedId = true)
private int id;
@DatabaseField
private long codigo;
@DatabaseField
private String situacao;
@DatabaseField(foreign=true)
private Produto produto;
@DatabaseField(foreign=true,foreignAutoRefresh=true)
private Estabelecimento estabelecimento;
...
}
这将是我的查找方法:
public List<SituacaoProduto> findByEstabelecimento(Estabelecimento estabelecimento, Context context){
List<SituacaoProduto> list = new ArrayList<SituacaoProduto>();
try{
Dao<SituacaoProduto, Integer> dao = getDatabase(context).getDao(SituacaoProduto.class);
QueryBuilder<SituacaoProduto, Integer> qBuilder = dao.queryBuilder();
// Monta select: (estabelecimento.codigo == codigoEstabelecimento)
qBuilder.where().eq("estabelecimento.codigo", estabelecimento.getCodigo());
PreparedQuery<SituacaoProduto> pQuery = qBuilder.prepare();
// Recupera registro
list = dao.query(pQuery);
}catch(SQLException e){
e.printStackTrace();
return null;
}finally{
if (database != null) {
OpenHelperManager.releaseHelper();
database = null;
}
}
return list;
}
我收到以下错误:
12-10 10:32:25.398:E / AndroidRuntime(19575): java.lang.IllegalArgumentException:未知的列名 表“situacaoproduto”中的“estabelecimento.codigo”
就好像没有引用外国游戏,如果我用我的estabelecimento_id
查找方法进行搜索就会让我摆脱错误,但不需要按codigo
进行过滤,这是一个代码,来自Web服务:
在这里我找到了一个解决方案,(link),但我拒绝这样做,将类属性声明为public static final是一种不好的做法
一些帮助?
答案 0 :(得分:1)
我想你想加入这里。您正在尝试返回其SituacaoProduto
字段的estabelecimento
等于某个值的codigo
,对吗?
因此,使用estabelecimentoDao
字段codigo
所在的eq(...)
构建查询。然后使用situacaoProdutoDao
查询加入该查询。
有关ORMLite连接功能的详细信息,请参见此处:
http://ormlite.com/docs/join-queries
我认为文档中的示例查询与您的需求非常相似。
将类属性声明为public static final是一种不好的做法“。
为什么这是一个糟糕的模式? ORM库如何知道您查询的字段?问题是如果您没有指定列名,ORMLite会为您的外部字段生成一个。他们在该字段上查询的唯一方法(如果您不想在连接机制上使用hte)是指定名称然后导出,以便您的查询代码可以使用它。与public static final
共享相同的字符串对我来说很有意义。