当我使用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
答案 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一样需要%%%%%%%%!对不起所有:))