Java eclipse PostgreSQL erro: syntax error at or near "$1"

estou fazendo um aplicativo desktop em Java no eclipse que faz cadastro e CRUD em um banco de dados PostgreSQL de cadastro de usuários
cadastro de clientes e cadastro de ordem de serviço.

na tela ordem de serviço, tenho um pequeno painel que puxa da tabela de clientes referente aquela ordem de serviço.
quando a ordem de serviço é pesquisada.

nessa tabela o cliente é pesquisado através do int idcli(coluna da tabela no PostgreSQL) que é puxado do txtCliId(* Id) no pequeno painel
preenchido pelos dados da tabela de ordem de serviço.

A ordem de serviço é acessada normalmente mas na hora de fazer a segunda requisição sql para os dados do cliente através
do método pesquisar_cliente_os() . que é chamada dentro do método pesquisar_os()

            private void pesquisar_cliente_os() {
		
		Connection conexao = appconn.connect();
		
	 String sql = "select idcli as Id, nomecli as Nome, fonecli as Fone, email from tbclientes where idcli ?";
     try {
         pst = conexao.prepareStatement(sql);
         pst.setInt(1,Integer.parseInt(txtCliId.getText()));
         rs=pst.executeQuery();
         tblClientesOs.setModel(DbUtils.resultSetToTableModel(rs));
         tamColunas();
     } catch (Exception e) {
        // JOptionPane.showMessageDialog(null, e);
     	e.printStackTrace();
     }
		
		
	}

dá um erro bizarro:

org.postgresql.util.PSQLException: ERROR: syntax error at or near "$1"
  Posição: 89
	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2575)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2297)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:335)
	at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:481)
	at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:401)
	at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:164)
	at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:114)
	at Telas.TelaEx.pesquisar_cliente_os(TelaEx.java:108)
	at Telas.TelaEx.pesquisar_os(TelaEx.java:67)
	at Telas.TelaEx$3.actionPerformed(TelaEx.java:194)
	at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1972)
	at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2313)
	at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
	at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
	at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279)
	at java.desktop/java.awt.Component.processMouseEvent(Component.java:6617)
	at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
	at java.desktop/java.awt.Component.processEvent(Component.java:6382)
	at java.desktop/java.awt.Container.processEvent(Container.java:2264)
	at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:4993)
	at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2322)
	at java.desktop/java.awt.Component.dispatchEvent(Component.java:4825)
	at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4934)
	at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4563)
	at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4504)
	at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2308)
	at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2773)
	at java.desktop/java.awt.Component.dispatchEvent(Component.java:4825)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
	at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
	at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

na linha

pst.setInt(1,Integer.parseInt(txtCliId.getText()));

parece que está o erro não sei, mas já tentei algumas variações como separar o txtCliId transformar o conteúdo em int depois
colocar no pst.setInt(…), tentei também trocar o parseInt para valueOf mesmo erro.

pesquisei o erro : syntax error at or near “$1” ,

mas parece que pode ser várias coisas não entendi as explicações.

a tabela onde deveria vir as informações do cliente fica sem aparecer nada.

Se alguém puder ajudar.

Parece que faltou um = no where:

idcli ?

deveria ser:

idcli = ?

resolvido, valeu de novo!