- All Known Implementing Classes:
- DefaultDiagnosticsListener
- Author:
- Lukas Eder
- 
Method SummaryModifier and TypeMethodDescriptiondefault voidThe executed JDBC statement has duplicates.default voidSomething went wrong while diagnosing a SQL query.default voidThe fetched JDBCResultSetreturned a primitive type value for a column, which could have been null, butResultSet.wasNull()was not called.default voidThe executed JDBC statement is repeated consecutively on the same JDBCConnection.default voidThe fetched JDBCResultSetreturned more columns than necessary.default voidThe fetched JDBCResultSetreturned more rows than necessary.default voidA trivial condition was encountered, which can be replaced by aNULLpredicate, or even byDSL.trueCondition()orDSL.falseCondition(), but it is more likely just a typo.default voidThe fetched JDBCResultSetreturned a value for a column, on whichResultSet.wasNull()was called unnecessarily (more than once, or for a non-primitive type).
- 
Method Details- 
tooManyRowsFetchedThe fetched JDBCResultSetreturned more rows than necessary.An event indicating that a JDBC ResultSetwas fetched withArows, but onlyBrows (B < A) were consumed.Typically, this problem can be remedied by applying the appropriate LIMITclause in SQL, orSelectLimitStep.limit(Number)clause in jOOQ.- Parameters:
- ctx- The context containing information about the diagnostic.
 
- 
tooManyColumnsFetchedThe fetched JDBCResultSetreturned more columns than necessary.An event indicating that a JDBC ResultSetwas fetched withAcolumns, but onlyB(B < A) were consumed.Typically, this problem can be remedied by not running a SELECT *query when this isn't strictly required.- Parameters:
- ctx- The context containing information about the diagnostic.
 
- 
unnecessaryWasNullCallThe fetched JDBCResultSetreturned a value for a column, on whichResultSet.wasNull()was called unnecessarily (more than once, or for a non-primitive type).- Parameters:
- ctx- The context containing information about the diagnostic.
 
- 
missingWasNullCallThe fetched JDBCResultSetreturned a primitive type value for a column, which could have been null, butResultSet.wasNull()was not called.- Parameters:
- ctx- The context containing information about the diagnostic.
 
- 
duplicateStatementsThe executed JDBC statement has duplicates.Many databases maintain an execution plan cache, which remembers execution plans for a given SQL string. These caches often use the verbatim SQL string (or a hash thereof) as a key, meaning that "similar" but not identical statements will produce different keys. This may be desired in rare cases when querying skewed data, as a hack to force the optimiser to calculate a new plan for a given "similar" but not identical query, but mostly, this is not desirable as calculating execution plans can turn out to be expensive. Examples of such duplicate statements include: Whitespace differencesSELECT * FROM actor; SELECT * FROM actor;Inline bind valuesSELECT * FROM actor WHERE id = 1; SELECT * FROM actor WHERE id = 2;Aliasing and qualificationSELECT a1.* FROM actor a1 WHERE id = ?; SELECT * FROM actor a2 WHERE a2.id = ?;Examples of identical statements (which are not considered duplicate, but repeatedStatements(DiagnosticsContext), if on the sameConnection) are:SELECT * FROM actor WHERE id = ?; SELECT * FROM actor WHERE id = ?;This is a system-wide diagnostic that is not specific to individual Connectioninstances.- Parameters:
- ctx- The context containing information about the diagnostic.
 
- 
repeatedStatementsThe executed JDBC statement is repeated consecutively on the same JDBCConnection.This problem goes by many names, the most famous one being the N + 1 problem, when a single (1) query for a parent entity requires many (N) subsequent queries for child entities. This could have been prevented by rewriting the parent query to use a JOIN. If such a rewrite is not possible (or not easy), the subsequent N queries could at least profit (depending on the exact query): - From reusing the PreparedStatement
- From being batched
- From being re-written as a bulk fetch or write query
 This problem can be aggravated if combined with the duplicateStatements(DiagnosticsContext)problem, in case of which the repeated statements might not be diagnosed as easily.Repeated statements may or may not be "identical". In the following example, there are two repeated and identical statements: SELECT * FROM actor WHERE id = ?; SELECT * FROM actor WHERE id = ?;In this example, we have three repeated statements, only some of which are also identical: SELECT * FROM actor WHERE id = ?; SELECT * FROM actor WHERE id = ?; SELECT * FROM actor WHERE id = ?;This is a Connection-specific diagnostic that is reset every timeConnection.close()is called.- Parameters:
- ctx- The context containing information about the diagnostic.
 
- From reusing the 
- 
trivialConditionA trivial condition was encountered, which can be replaced by aNULLpredicate, or even byDSL.trueCondition()orDSL.falseCondition(), but it is more likely just a typo.A trivial condition might compare a column to itself, e.g. SELECT * FROM actor a JOIN film_actor fa ON a.actor_id = a.actor_idThe above JOINpredicate is effectivelya.actor_id IS NOT NULL, but what the author probably meant was to writea.actor_id = fa.actor_idinstead.This mistake can often be very subtle, especially when comparing columns of composite constraints. In many cases, it's a bug, and if it isn't there's probably a more straightforward way to declare the condition. - Parameters:
- ctx- The context containing information about the diagnostic.
 
- 
exceptionSomething went wrong while diagnosing a SQL query.The actual exception will be provided by DiagnosticsContext.exception(). Likely exceptions include:- A ParserExceptionbecause jOOQ couldn't parse user defined SQL.
- A user exception from a custom DiagnosticsListenerimplementation.
 - Parameters:
- ctx- The context containing information about the diagnostic.
 
- A 
 
-