OrmLite使用QueryBuilder对3个表进行复杂查询

时间:2017-02-21 16:49:46

标签: java ormlite

我正在尝试使用OrmLite的QueryBuilder对三个表进行查询。 我的问题是我的最终查询没有返回任何结果,而仅针对InfoInfoFenomenoInstruccion执行查询会返回结果。

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 )

提前致谢。

0 个答案:

没有答案