使用Ormlite作为JOIN 2表

时间:2014-07-15 19:56:42

标签: ormlite

当我使用pedidoQb.join(clientQb).prepareStatementString();时,返回SELECT pedido.* FROM pedido INNER JOIN cliente ON pedido.idcliente = cliente.idCliente WHERE cliente.nomeRazao LIKE 'MARIA'

好的,完美。

当我使用

`@Override
public List<Pedido> list(Pedido pedido) throws SQLException {

QueryBuilder<Pedido, Integer> pedidoQb = this.getDaoDB().queryBuilder();

    QueryBuilder<Cliente, Integer> clientQb = ((DAOImplementation)new DAOFactory().getClienteDAO(this.getContext())).getDaoDB().queryBuilder();

    clientQb.where().like("nomeRazao", "ANA");

    // select * from cliente inner join pedido on cliente.idcliente = pedido.idcliente where cliente.nomerazao like "%nome%";


    return pedidoQb.join(clientQb).query();
}`

选择生成的

Problems executing Android query: SELECT `pedido`.* FROM `pedido` INNER JOIN `cliente` ON `pedido`.`idcliente` = `cliente`.`idCliente` INNER JOIN `cliente` ON `pedido`.`idcliente` = `cliente`.`idCliente` WHERE `cliente`.`nomeRazao` LIKE 'MARIA' AND (`cliente`.`nomeRazao` LIKE 'MARIA' )

错误:

(1) ambiguous column name: cliente.nomeRazao

出了什么问题?

对象Pedido

@DatabaseTable(tableName =  "pedido")

公共类Pedido实现了Serializable {

@DatabaseField(unique = true, id = true)
private Integer idPedido;

@DatabaseField
private Date dataPedido;

@DatabaseField
private Date dataVencimento;

@DatabaseField
private Date dataBrinde;

/**
 * Integer idViagemPedido
 *
 * Chave foregnKey da tabela Viagem(idViagem)
 * Viagem que o pedido foi feito
 * Quando cadastrado no tablet deve assumir o valor
 * que existe na tabela Viagem.
 * Quando vier da API virá com o id da viagem que foi feito
 */
@DatabaseField(foreign = true, foreignAutoRefresh = true, columnName = "idviagem", columnDefinition = "integer references viagem(idViagem)")
private Viagem idViagemPedido;

/**
 * Integer idCliente
 *
 * Chave foregnKey da tabela Cliente(idCliente)
 */
@DatabaseField(foreign = true, foreignAutoRefresh = true, columnName = "idcliente", columnDefinition = "integer references cliente(idCliente)")
private Cliente idCliente;

/**
 * Integer idCobrador
 *
 * Chave foregnKey da tabela Viagem(idCobrador)
 * Quando cadastrado no android deve assumir o valor
 * que contém na tabela Viagem.
 * Quando for integrado da API terá o id do cobrador da viagem do pedido.
 */
//@DatabaseField(foreign = true, foreignAutoRefresh = true, columnName = "idcobrador", columnDefinition = "integer references viagem(idCobrador)")
@DatabaseField
private Integer idCobrador;

/**
 * Integer idVendedor
 *
 * Quando cadastrado no android deve assumir o valor
 * do idCobrador, isso é se foi feito por um cobrador.
 */
@DatabaseField
private Integer idVendedor;

/**
 * Integer idTampeiro
 *
 * Quando cadastrado no android deve assumir o valor
 * de qual Tampeiro do pedido.
 * Se houver mais de um tampeiro na viagem deve aparecer
 * para o cobrador escolher, se não pegar o valor do contido
 * na tabela Viagem.
 */
@DatabaseField
private Integer idTampeiro;

@DatabaseField
private Double percDevolucao;

@DatabaseField
private Double percBrinde;

@DatabaseField
private Double totalConsignado;

@DatabaseField
private Double totalVendido;

@DatabaseField
private Double totalTrocaEntrada;

@DatabaseField
private Double totalTrocaSaida;

@DatabaseField
private Double totalBrinde;

@DatabaseField
private Double totalAcrescimo;

@DatabaseField
private Double totalDesconto;

@DatabaseField
private Double totalLiquido;

@DatabaseField
private Double totalPago;

@DatabaseField
private Double totalApagar;

@DatabaseField
private Integer status;

@DatabaseField
private Integer statusNovo; // 0 -> não é novo, 1 -> é novo


/***********************************************
 *  Initiation of methods
 ***********************************************/

public Integer getStatus() {
    return status;
}

public void setStatus(Integer status) {
    this.status = status;
}

public Integer getIdPedido()
{
    return idPedido;
}

public void setIdPedido(Integer idPedido)
{
    this.idPedido = idPedido;
}

public Date getDataPedido()
{
    return dataPedido;
}

public void setDataPedido(Date dataPedido)
{
    this.dataPedido = dataPedido;
}

public Date getDataVencimento()
{
    return dataVencimento;
}

public void setDataVencimento(Date dataVencimento)
{
    this.dataVencimento = dataVencimento;
}

public Date getDataBrinde()
{
    return dataBrinde;
}

public void setDataBrinde(Date dataBrinde)
{
    this.dataBrinde = dataBrinde;
}

public Viagem getIdViagemPedido()
{
    return idViagemPedido;
}

public void setIdViagemPedido(Viagem idViagemPedido)
{
    this.idViagemPedido = idViagemPedido;
}

public Cliente getIdCliente()
{
    return idCliente;
}

public void setIdCliente(Cliente idCliente)
{
    this.idCliente = idCliente;
}

public Integer getIdCobrador()
{
    return idCobrador;
}

public void setIdCobrador(Integer idCobrador)
{
    this.idCobrador = idCobrador;
}

public Integer getIdVendedor()
{
    return idVendedor;
}

public void setIdVendedor(Integer idVendedor)
{
    this.idVendedor = idVendedor;
}

public Integer getIdTampeiro()
{
    return idTampeiro;
}

public void setIdTampeiro(Integer idTampeiro)
{
    this.idTampeiro = idTampeiro;
}

public Double getPercDevolucao()
{
    return percDevolucao;
}

public void setPercDevolucao(Double percDevolucao)
{
    this.percDevolucao = percDevolucao;
}

public Double getPercBrinde()
{
    return percBrinde;
}

public void setPercBrinde(Double percBrinde)
{
    this.percBrinde = percBrinde;
}

public Double getTotalConsignado()
{
    return totalConsignado;
}

public void setTotalConsignado(Double totalConsignado)
{
    this.totalConsignado = totalConsignado;
}

public Double getTotalVendido()
{
    return totalVendido;
}

public void setTotalVendido(Double totalVendido)
{
    this.totalVendido = totalVendido;
}

public Double getTotalTrocaEntrada()
{
    return totalTrocaEntrada;
}

public void setTotalTrocaEntrada(Double totalTrocaEntrada)
{
    this.totalTrocaEntrada = totalTrocaEntrada;
}

public Double getTotalTrocaSaida()
{
    return totalTrocaSaida;
}

public void setTotalTrocaSaida(Double totalTrocaSaida)
{
    this.totalTrocaSaida = totalTrocaSaida;
}

public Double getTotalBrinde()
{
    return totalBrinde;
}

public void setTotalBrinde(Double totalBrinde)
{
    this.totalBrinde = totalBrinde;
}

public Double getTotalAcrescimo()
{
    return totalAcrescimo;
}

public void setTotalAcrescimo(Double totalAcrescimo)
{
    this.totalAcrescimo = totalAcrescimo;
}

public Double getTotalDesconto()
{
    return totalDesconto;
}

public void setTotalDesconto(Double totalDesconto)
{
    this.totalDesconto = totalDesconto;
}

public Double getTotalLiquido()
{
    return totalLiquido;
}

public void setTotalLiquido(Double totalLiquido)
{
    this.totalLiquido = totalLiquido;
}

public Double getTotalPago()
{
    return totalPago;
}

public void setTotalPago(Double totalPago)
{
    this.totalPago = totalPago;
}

public Double getTotalApagar()
{
    return totalApagar;
}

public void setTotalApagar(Double totalApagar)
{
    this.totalApagar = totalApagar;
}

public Integer getStatusNovo() {
    return statusNovo;
}

public void setStatusNovo(Integer statusNovo) {
    this.statusNovo = statusNovo;
}

}

@DatabaseTable

公共类Cliente实现了Serializable {

@SerializedName(value = "id_cliente")
@DatabaseField(canBeNull = false, unique = true, id = true)
private Integer idCliente;

@SerializedName(value = "data_cadastro")
@DatabaseField
private Date dataCadastro;

@SerializedName(value = "tipo_pessoa")
@DatabaseField(width = 1)
private String tipoPessoa;

@SerializedName(value = "nome_razao")
@DatabaseField(width = 60, canBeNull = true)
private String nomeRazao;

@SerializedName(value = "nome_fantasia")
@DatabaseField(width = 60)
private String nomeFantasia;

@SerializedName(value = "nome_responsavel")
@DatabaseField(width = 60)
private String nomeResponsavel;

@DatabaseField(width = 14, uniqueIndex = true)
private String cpf;

@DatabaseField(width = 14, uniqueIndex = true)
private String cnpj;

@DatabaseField(width = 14)
private String ie;

@DatabaseField(width = 14)
private String rg;

@SerializedName(value = "orgao_expedidor")
@DatabaseField(width = 10)
private String orgaoExpedidor;

@SerializedName(value = "data_nascimento")
@DatabaseField
private Date dataNascimento;

@SerializedName(value = "nome_pai")
@DatabaseField(width = 60)
private String nomePai;

@SerializedName(value = "nome_mae")
@DatabaseField(width = 60)
private String nomeMae;

@DatabaseField(width = 14)
private String fone1;

@DatabaseField(width = 14)
private String fone2;

@DatabaseField(width = 60)
private String email;

@DatabaseField(width = 2)
private String uf;

@SerializedName(value = "id_cidade")
@DatabaseField
private Integer idCidade;

@DatabaseField(width = 8)
private String cep;

@DatabaseField(width = 60)
private String endereco;

@DatabaseField(width = 60)
private String bairro;

@DatabaseField(width = 6)
private String numero;

@DatabaseField(width = 35)
private String referencia;

@DatabaseField
private Integer novoCliente;

public Integer getIdCliente() {
    return idCliente;
}

public void setIdCliente(Integer idCliente) {
    this.idCliente = idCliente;
}

public Date getDataCadastro() {
    return dataCadastro;
}

public void setDataCadastro(Date dataCadastro) {
    this.dataCadastro = dataCadastro;
}

public String getTipoPessoa() {
    return tipoPessoa;
}

public void setTipoPessoa(String tipoPessoa) {
    this.tipoPessoa = tipoPessoa;
}

public String getNomeRazao() {
    return nomeRazao;
}

public void setNomeRazao(String nomeRazao) {
    this.nomeRazao = nomeRazao;
}

public String getNomeFantasia() {
    return nomeFantasia;
}

public void setNomeFantasia(String nomeFantasia) {
    this.nomeFantasia = nomeFantasia;
}

public String getNomeResponsavel() {
    return nomeResponsavel;
}

public void setNomeResponsavel(String nomeResponsavel) {
    this.nomeResponsavel = nomeResponsavel;
}

public String getCpf() {
    return cpf;
}

public void setCpf(String cpf) {
    this.cpf = cpf;
}

public String getCnpj() {
    return cnpj;
}

public void setCnpj(String cnpj) {
    this.cnpj = cnpj;
}

public String getIe() {
    return ie;
}

public void setIe(String ie) {
    this.ie = ie;
}

public String getRg() {
    return rg;
}

public void setRg(String rg) {
    this.rg = rg;
}

public String getOrgaoExpedidor() {
    return orgaoExpedidor;
}

public void setOrgaoExpedidor(String orgaoExpedidor) {
    this.orgaoExpedidor = orgaoExpedidor;
}

public Date getDataNascimento() {
    return dataNascimento;
}

public void setDataNascimento(Date dataNascimento) {
    this.dataNascimento = dataNascimento;
}

public String getNomePai() {
    return nomePai;
}

public void setNomePai(String nomePai) {
    this.nomePai = nomePai;
}

public String getNomeMae() {
    return nomeMae;
}

public void setNomeMae(String nomeMae) {
    this.nomeMae = nomeMae;
}

public String getFone1() {
    return fone1;
}

public void setFone1(String fone1) {
    this.fone1 = fone1;
}

public String getFone2() {
    return fone2;
}

public void setFone2(String fone2) {
    this.fone2 = fone2;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getUf() {
    return uf;
}

public void setUf(String uf) {
    this.uf = uf;
}

public Integer getIdCidade() {
    return idCidade;
}

public void setIdCidade(Integer idCidade) {
    this.idCidade = idCidade;
}

public String getCep() {
    return cep;
}

public void setCep(String cep) {
    this.cep = cep;
}

public String getEndereco() {
    return endereco;
}

public void setEndereco(String endereco) {
    this.endereco = endereco;
}

public String getBairro() {
    return bairro;
}

public void setBairro(String bairro) {
    this.bairro = bairro;
}

public String getNumero() {
    return numero;
}

public void setNumero(String numero) {
    this.numero = numero;
}

public String getReferencia() {
    return referencia;
}

public void setReferencia(String referencia) {
    this.referencia = referencia;
}

public Integer getNovoCliente() {
    return novoCliente;
}

public void setNovoCliente(Integer novoCliente) {
    this.novoCliente = novoCliente;
}

}

错误complet

07-15 19:55:53.976 1603-1603/br.com.forcavenda E/SQLiteLog﹕ (1) ambiguous column name: cliente.nomeRazao 07-15 19:55:53.976 1603-1603/br.com.forcavenda W/System.err﹕ java.sql.SQLException: Problems executing Android query: SELECT pedido.* FROM pedido INNER JOIN cliente ON pedido.idcliente = cliente.idCliente INNER JOIN cliente ON pedido.idcliente = cliente.idCliente WHERE cliente.nomeRazao LIKE 'ANA' AND (cliente.nomeRazao LIKE 'ANA' ) 07-15 19:55:53.980 1603-1603/br.com.forcavenda W/System.err﹕ at com.j256.ormlite.misc.SqlExceptionUtil.create(SqlExceptionUtil.java:22) 07-15 19:55:53.980 1603-1603/br.com.forcavenda W/System.err﹕ at com.j256.ormlite.android.AndroidCompiledStatement.getCursor(AndroidCompiledStatement.java:184) 07-15 19:55:53.980 1603-1603/br.com.forcavenda W/System.err﹕ at com.j256.ormlite.android.AndroidCompiledStatement.runQuery(AndroidCompiledStatement.java:65) 07-15 19:55:53.980 1603-1603/br.com.forcavenda W/System.err﹕ at com.j256.ormlite.stmt.SelectIterator.<init>(SelectIterator.java:55) 07-15 19:55:53.980 1603-1603/br.com.forcavenda W/System.err﹕ at com.j256.ormlite.stmt.StatementExecutor.buildIterator(StatementExecutor.java:247) 07-15 19:55:53.980 1603-1603/br.com.forcavenda W/System.err﹕ at com.j256.ormlite.stmt.StatementExecutor.query(StatementExecutor.java:196) 07-15 19:55:53.980 1603-1603/br.com.forcavenda W/System.err﹕ at com.j256.ormlite.dao.BaseDaoImpl.query(BaseDaoImpl.java:265) 07-15 19:55:53.980 1603-1603/br.com.forcavenda W/System.err﹕ at com.j256.ormlite.stmt.QueryBuilder.query(QueryBuilder.java:361) 07-15 19:55:53.984 1603-1603/br.com.forcavenda W/System.err﹕ at br.com.forcavenda.storage.dao.implementacao.PedidoDAOImplementation.list(PedidoDAOImplementation.java:62) 07-15 19:55:53.984 1603-1603/br.com.forcavenda W/System.err﹕ at br.com.forcavenda.controllers.implementation.PedidoControllerImplementation.list(PedidoControllerImplementation.java:54) 07-15 19:55:53.984 1603-1603/br.com.forcavenda W/System.err﹕ at br.com.forcavenda.view.ListaPedidoActivity$PlaceholderFragment.atualizarListaPedido(ListaPedidoActivity.java:108) 07-15 19:55:53.984 1603-1603/br.com.forcavenda W/System.err﹕ at br.com.forcavenda.view.ListaPedidoActivity$PlaceholderFragment.onCreateView(ListaPedidoActivity.java:81) 07-15 19:55:53.984 1603-1603/br.com.forcavenda W/System.err﹕ at android.support.v4.app.Fragment.performCreateView(Fragment.java:1504) 07-15 19:55:53.984 1603-1603/br.com.forcavenda W/System.err﹕ at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:942) 07-15 19:55:53.988 1603-1603/br.com.forcavenda W/System.err﹕ at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1121) 07-15 19:55:53.988 1603-1603/br.com.forcavenda W/System.err﹕ at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 07-15 19:55:53.992 1603-1603/br.com.forcavenda W/System.err﹕ at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1484) 07-15 19:55:53.992 1603-1603/br.com.forcavenda W/System.err﹕ at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:571) 07-15 19:55:53.992 1603-1603/br.com.forcavenda W/System.err﹕ at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1163) 07-15 19:55:53.996 1603-1603/br.com.forcavenda W/System.err﹕ at android.app.Activity.performStart(Activity.java:5018) 07-15 19:55:53.996 1603-1603/br.com.forcavenda W/System.err﹕ at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2032) 07-15 19:55:53.996 1603-1603/br.com.forcavenda W/System.err﹕ at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 07-15 19:55:53.996 1603-1603/br.com.forcavenda W/System.err﹕ at android.app.ActivityThread.access$600(ActivityThread.java:130) 07-15 19:55:54.000 1603-1603/br.com.forcavenda W/System.err﹕ at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 07-15 19:55:54.000 1603-1603/br.com.forcavenda W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:99) 07-15 19:55:54.000 1603-1603/br.com.forcavenda W/System.err﹕ at android.os.Looper.loop(Looper.java:137) 07-15 19:55:54.004 1603-1603/br.com.forcavenda W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:4745) 07-15 19:55:54.004 1603-1603/br.com.forcavenda W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method) 07-15 19:55:54.004 1603-1603/br.com.forcavenda W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:511) 07-15 19:55:54.008 1603-1603/br.com.forcavenda W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 07-15 19:55:54.008 1603-1603/br.com.forcavenda W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 07-15 19:55:54.008 1603-1603/br.com.forcavenda W/System.err﹕ at dalvik.system.NativeStart.main(Native Method) 07-15 19:55:54.008 1603-1603/br.com.forcavenda W/System.err﹕ Caused by: android.database.sqlite.SQLiteException: ambiguous column name: cliente.nomeRazao (code 1): , while compiling: SELECT pedido.* FROM pedido INNER JOIN cliente ON pedido.idcliente = cliente.idCliente INNER JOIN cliente ON pedido.idcliente = cliente.idCliente WHERE cliente.nomeRazao LIKE 'ANA' AND (cliente.nomeRazao LIKE 'ANA' ) 07-15 19:55:54.012 1603-1603/br.com.forcavenda W/System.err﹕ at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 07-15 19:55:54.012 1603-1603/br.com.forcavenda W/System.err﹕ at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882) 07-15 19:55:54.012 1603-1603/br.com.forcavenda W/System.err﹕ at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493) 07-15 19:55:54.016 1603-1603/br.com.forcavenda W/System.err﹕ at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 07-15 19:55:54.016 1603-1603/br.com.forcavenda W/System.err﹕ at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 07-15 19:55:54.016 1603-1603/br.com.forcavenda W/System.err﹕ at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37) 07-15 19:55:54.020 1603-1603/br.com.forcavenda W/System.err﹕ at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44) 07-15 19:55:54.020 1603-1603/br.com.forcavenda W/System.err﹕ at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314) 07-15 19:55:54.020 1603-1603/br.com.forcavenda W/System.err﹕ at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1253) 07-15 19:55:54.020 1603-1603/br.com.forcavenda W/System.err﹕ at com.j256.ormlite.android.compat.JellyBeanApiCompatibility.rawQuery(JellyBeanApiCompatibility.java:21) 07-15 19:55:54.020 1603-1603/br.com.forcavenda W/System.err﹕ at com.j256.ormlite.android.AndroidCompiledStatement.getCursor(AndroidCompiledStatement.java:180) 07-15 19:55:54.020 1603-1603/br.com.forcavenda W/System.err﹕ ... 30 more 07-15 19:55:54.028 1603-1603/br.com.forcavenda I/Choreographer﹕ Skipped 1301 frames! The application may be doing too much work on its main thread. 07-15 19:55:54.104 1603-1603/br.com.forcavenda W/EGL_emulation﹕ eglSurfaceAttrib not implemented

1 个答案:

答案 0 :(得分:0)

解决!

@Override
public List<Pedido> list(Pedido pedido) throws SQLException {

    QueryBuilder<Pedido, Integer> pedidoQb = this.getDaoDB().queryBuilder();

    QueryBuilder<Cliente, Integer> clientQb = ((DAOImplementation)new DAOFactory().getClienteDAO(this.getContext())).getDaoDB().queryBuilder();

    clientQb.where().like("nomeRazao", "%" + pedido.getIdCliente().getNomeRazao() + "%");

    return pedidoQb.join(clientQb).query();
}

像LIKE一样需要%%%%%%%%!对不起所有:))