我已经使用ORMLite近一年了,我发现它非常好,很简单,而且很有效。
我有一个项目要求实现一个广泛的搜索功能 - 用户输入一个值,应该返回表中的任何匹配字段(POJO)。表与Java对象具有简单的1:1关系。
我可以使用queryBuilder()来实现一个KNOWN类.where()。like(...)但是,我想为所有子类构建一个通用的动态函数。
我的所有持久化类都派生自“Persistent”基类,它具有一些基本的内务处理,处理单个对象的存储和删除。这就是我放置“查找”功能的地方,它最理想地返回Iterator或List< T>,最好是Iterator。
我已经有了一个Map< String,DataType>对于所有DatabaseField带注释的字段。 现在,我只想要一个“野蛮”力量字段“X”出现在字段Y 的任何地方。我将找出数据类型转换并稍后检查。如果我可以动态构建查询,那么我可以在下一个版本中解决数据输入问题。
我已经看过将地图作为参数的方法,它们是一个狭窄的匹配,即所有必须匹配。我正在寻找相反的结果:任何比赛都可以。
我能想到的唯一方法是构建单独的“like”组件并将它们组合成一个更大的语句,从文档中,我无法弄清楚如何动态地执行此操作。
欢迎任何建议。
答案 0 :(得分:0)
好的,我已经搞砸了一些代码,这实现了我想要的 - 但我非常欢迎评论改进或提出更好的方法来实现预期的结果。
protected QueryBuilder<T, Long> getQuery(String text, boolean wide, boolean count) {
if (null == fields)
reflectKeyInfo();
QueryBuilder<T, Long> qb = null;
if (count)
qb = getDao().queryBuilder().setCountOf(true);
else
qb = getDao().queryBuilder();
if (null == qb)
return null;
Where<T, Long> where = qb.where();
boolean equals = text.contains("=") ;
boolean like = text.contains("~") ;
if (equals || like) {
String field = null ;
String value = null ;
try {
if (equals) {
field = Strings.left(text, text.indexOf("=")) ;
value = Strings.right(text, text.indexOf("=")) ;
if (Strings.isValid(field) && Strings.isValid(value))
where.eq(field, value) ;
}
else
if (like) {
field = Strings.left(text, text.indexOf("~")) ;
value = Strings.right(text, text.indexOf("~")) ;
if (Strings.isValid(field) && Strings.isValid(value))
where.like(field, "%" + value + "%") ;
}
}
catch (SQLException e) {
lastError = GlobalConfig.log(e, true) ;
Dialogs.alert("Query Failed",
"<br />Unable to extract field and value from " +
field + "=" + value + "<br />" + lastError) ;
}
}
else
for (String field : fields.keySet()) {
try {
if (fields.get(field).isAssignableFrom(String.class)) {
if (wide)
where.like(field, "%" + text + "%");
else
where.eq(field, text);
where.or();
}
}
catch (SQLException e) {
lastError = GlobalConfig.log(e, true);
}
} // for
return qb;
}