2017-12-07 1 views
0

Sie haben einen neuen Job begonnen und müssen Java lernen (seit über einem Jahrzehnt .NET-Entwickler). Ein Mandat von oben bestimmt alle neuen Sachen in Java/Oracle.JDBC wird nicht zurückgeliefert ResultSet records

Also ich laufe durch das PluralSight-Training und gerade jetzt versuche ich, die Feinheiten von JDBC zu lernen.

Ich habe die folgende Tabelle in einer Oracle Database (auch eine neue Technologie für mich).

CREATE TABLE "TEST"."ACCOUNT" 
(
"ACCOUNT_ID" NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY VALUE, 
"ACCOUNT_NAME" VARCHAR2(20) 
"ACCOUNT_NUMBER" VARCHAR2(20) 
"ACCOUNT_TYPE" VARCHAR2(20) 
) 

Ich habe einige Code mit dem Repository-Muster eingerichtet. Aber es ist ziemlich einfach:

public static void main(String[] args) throws IOException { 

IAccountMapper accountMapper = new AccountMapper(); 
IConfiguration configuration = new OracleConfiguration(); 

try (
     IDataAccess<ResultSet> dataAccess = new OracleDataAccess(configuration); 
     IAccountRepository accountRepo = new AccountRepository(accountMapper, dataAccess); 
     ){ 

    //nothing here 
    List<Account> accounts = accountRepo.query(new AllAccountsSpecification()); 


} catch (Exception e){ 
    System.err.println(e.getMessage()); 
} 

}

Die IDataAccess Schnittstelle:

public interface IDataAccess<T> { 

    T get(String query) throws SQLException; 
} 

Alle meine Implementierung ist in den Basisklassen und die Unterklassen referenziert werden - das heißt:

public interface IOracleDataAccess extends IDataAccess<ResultSet>{ 

} 

public class OracleDataAccess extends DataAccessBase<ResultSet> implements IOracleDataAccess { 

public OracleDataAccess(IConfiguration configuration) throws SQLException { 
    super(configuration); 
} 

Die Implementierung von IDataAccess (eine Basisklasse, wobei T die von der Repo-Geschäfte):

public abstract class DataAccessBase<T> implements AutoCloseable { 

protected final IConfiguration configuration; 
protected Connection connection; 
protected PreparedStatement statement; 
protected ResultSet resultSet; 

    public DataAccessBase(IConfiguration configuration) { 
     this.configuration = configuration; 
     this.connection = DriverManager.getConnection(configuration.getConnectionString(), 
       configuration.getUsername(), configuration.getPassword()); 
    } 

    public T get(String query) throws SQLException { 
     statement = connection.prepareStatement(query); 
     return (T)statement.executeQuery(); 
    } 
} 

Diese Dataaccess-Klasse in meine Repository-Klasse injiziert wird und verwendet wird, um die Ergebnisse zurück:

public abstract class ReadOnlyRepositoryBase<T> implements IReadOnlyRepository<T> { 

protected final IMapper<ResultSet, T> mapper; 
protected final IDataAccess<ResultSet> database; 

public ReadOnlyRepositoryBase(IMapper<ResultSet, T> mapper, IDataAccess<ResultSet> database) { 
    this.mapper = mapper; 
    this.database = database; 
} 

public List<T> query(ISpecification specification){ 
    List<T> entities = new ArrayList<>; 

    try { 

     System.out.println(specification.toSqlQuery()); 
     //This is what is output: 
     //SELECT * FROM ACCOUNT 

     //this returns 1 record when: "select tablespace_name, table_name from user_tables" 
     //returns no records when "select * from account" 
     ResultSet rs = database.get(specification.toSqlQuery()); 

     //loop is never entered for "select * from account" 
     //runs once for "select tablespace_name, table_name from user_tables" 
     while(rs.next()){ 
      entities.add(mapper.map(rs)); 
     } 
    } catch (SQLException sqlEx){ 
     sqlEx.printStackTrace(); 
    } 

    return entities; 
} 
} 

Das Problem ist nichts kommt zurück (das ResultSet next() Methode gibt false zurück) Diese SQL:

Gibt 2 Datensätze von der Oracle SQL Developer IDE - aber nichts in Code.

Wenn ich diese Abfrage von Code ausführen:

"SELECT TABLESPACE_NAME, TABLE_NAME FROM USER_TABLES" 

ich 1 Datensatz zurück (TEST, ACCOUNT)

Muss ich weiter die Tabellen in der SQL qualifizieren, um wieder Datensätze zu bekommen?

Ich bin in der Datenbank mit den gleichen Anmeldeinformationen angemeldet, mit denen ich mich verbinde - also glaube ich nicht, dass es eine Erlaubnis Sache ist.

+0

Der Code, den Sie freigegeben haben, reicht nicht aus, um das Problem zu lösen. Bitte teilen Sie mehr Code über den Fluss, Eingangsdaten, etc. – Ele

+0

Bitte fügen Sie 'System.println (specification.toSqlQuery());' Anweisung (oder einen anderen Code, der dies in ein Protokoll drucken) direkt nach 'try {' und before 'ResultSet rs = dat ....', führe einen Code aus und überprüfe eine Konsole (oder logge) - kopiere bitte eine in der Konsole oder im Log ausgedruckte Anweisung und füge sie in die Frage ein. – krokodilko

+0

Wenn Sie gerade die Tabelle erstellt und die zwei Zeilen in SQL Developer eingefügt haben, haben Sie in dieser Sitzung vor dem Abfragen von Java "committen"? –

Antwort

0

Fühlen Sie sich wie ein Idiot - aber ich stelle mir vor, ich bin nicht der erste hier. @AlexPoole war genau richtig. Ich hatte die Datensätze über die IDE eingefügt - aber anscheinend Ich habe sie nicht begangen. Kommend von SQL Server - Ich brauche nicht nach einem

Ich denke, das ist anders bei Oracle.

+0

Es gibt eine Option in den Einstellungen von SQL Developer, Autocommit zu aktivieren, aber ich habe nie das Bedürfnis gefühlt - ich bevorzuge die explizite und manuelle Transaktionskontrolle (aber dann mache ich es schon lange so ... .). Ich würde Autocommit über JDBC auch persönlich vermeiden. (Und nein, du bist nicht sehr der erste ... es ist die erste Frage, die ich stelle, wenn es eine Datenabweichung zu geben scheint!) –

Verwandte Themen