我正在尝试使用OrmLite的QueryBuilder对三个表进行查询。
我的问题是我的最终查询没有返回任何结果,而仅针对Info
,InfoFenomeno
或Instruccion
执行查询会返回结果。
public List<PasoInstruccion> consultar(Request request) {
InfoRequest infoRequest = (InfoRequest) request;
ArrayList<PasoInstruccion> pasos = new ArrayList<>();
List<PasoInstruccion> pasosResult = null;
try {
QueryBuilder<Info, Long> infoQuery = LocalDBHelper.getInstance(context).getInfoDao().queryBuilder();
QueryBuilder<InfoFenomeno, Long> fenomenoQuery = LocalDBHelper.getInstance(context).getInfoFenomenoDao().queryBuilder();
fenomenoQuery.where()
.eq(InfoFenomeno.COLUMN_FENOMENO, infoRequest.getFenomeno());
infoQuery.join(fenomenoQuery);
QueryBuilder<Instruccion, Long> instruccionQuery = LocalDBHelper.getInstance(context).getInstruccionDao().queryBuilder();
instruccionQuery.where()
.eq(Instrucciones.COLUMN_NIVEL_AFECTACION, infoRequest.getNivelAfectacion())
.and()
.eq(Instrucciones.COLUMN_CATEGORIA_INFO, infoRequest.getCategoria())
.and()
.eq(Instrucciones.COLUMN_AMBIENTE_INFO, infoRequest.getSituacion());
QueryBuilder<PasoInstruccion, Long> pasoInstruccionQuery = LocalDBHelper.getInstance(context).getPasoInstruccionDao().queryBuilder();
instruccionQuery.join(infoQuery);
pasoInstruccionQuery.join(instruccionQuery);
pasosResult = pasoInstruccionQuery.query();
} catch (SQLException e) {
e.printStackTrace();
}
return pasosResult;
}
DB上的结构就像这样(简化):
public class Info {
@DatabaseField(id = true, columnName = Infos.COLUMN_ID)
private long id;
@DatabaseField(columnName = Infos.COLUMN_NOMBRE)
private String nombre;
@ForeignCollectionField(eager = true, columnName = Infos.COLUMN_FENOMENO)
private ForeignCollection<InfoFenomeno> infoFenomenos;
@ForeignCollectionField(eager = true, columnName = Infos.COLUMN_INSTRUCCION)
private ForeignCollection<Instruccion> pInstrucciones;
}
public class InfoFenomeno {
@DatabaseField(generatedId = true, columnName = InfoFenomeno.COLUMN_ID)
private long id;
@DatabaseField(foreign = true, foreignAutoRefresh = true, columnName = InfoFenomeno.COLUMN_INFO)
private Info info;
@DatabaseField(foreign = true, foreignAutoRefresh = true, columnName = InfoFenomeno.COLUMN_FENOMENO)
private Fenomeno fenomeno;
}
public class Instruccion {
@DatabaseField(generatedId = true)
private long id;
@DatabaseField(columnName = Instrucciones.COLUMN_NIVEL_AFECTACION)
private String nivelAfectacionString;
@DatabaseField(columnName = Instrucciones.COLUMN_CATEGORIA_INFO)
private String categoriaInformacionString;
@DatabaseField(columnName = Instrucciones.COLUMN_AMBIENTE_INFO)
private String ambienteInformacionString;
@ForeignCollectionField(eager = true)
private ForeignCollection<PasoInstruccion> pPasosInstruccion;
@DatabaseField(foreign = true, foreignAutoRefresh = true, columnName = Instrucciones.COLUMN_INFO)
private Info info;
}
public class PasoInstruccion {
@DatabaseField(id = true, columnName = PasoInstrucciones.COLUMN_ID)
private long secuencia;
@DatabaseField(columnName = PasoInstrucciones.COLUMN_NOMBRE)
private String nombre;
@DatabaseField(columnName = PasoInstrucciones.COLUMN_INSTRUCCION, foreignAutoRefresh = true, foreign = true)
private Instruccion instruccion;
}
InfoRequest参数中的值是正确的。 可能是我没有以正确的方式使用QueryBuilder?
编辑:SQL语句
SELECT `pasoInstrucciones`.* FROM `pasoInstrucciones` INNER JOIN `instrucciones` ON `pasoInstrucciones`.`_instruccion` = `instrucciones`.`id` INNER JOIN `infos` ON `instrucciones`.`_info` = `infos`.`_id` INNER JOIN `infoFenomeno` ON `infos`.`_id` = `infoFenomeno`.`_info` WHERE ((`instrucciones`.`_nivelAfectacion` = 'BAJO' AND `instrucciones`.`_categoriaInfo` = 'ANTES' ) AND `instrucciones`.`_ambienteInfo` = 'HOGAR' ) AND (`infoFenomeno`.`_fenomeno` = 6 )
提前致谢。