hibernate/hibernate-orm · error · NoSuchElementException
No more item in JSON document
Error message
No more item in JSON document
What it means
OsonDocumentReader wraps Oracle's OracleJsonParser for binary OSON documents. next() defensively re-checks parser.hasNext() and throws NoSuchElementException 'No more item in JSON document' when the caller drains past the end - in Hibernate-driven reads this means the embeddable mapping's structure expectation (driven by getAdapter) wants more events than the stored document actually contains.
Source
Thrown at hibernate-core/src/main/java/org/hibernate/type/format/OsonDocumentReader.java:48
private Object currentValue;
/**
* Creates a new <code>OsonDocumentReader</code> on top of a <code>OracleJsonParser</code>
* @param parser the parser
*/
public OsonDocumentReader(OracleJsonParser parser) {
this.parser = parser;
}
@Override
public boolean hasNext() {
return this.parser.hasNext();
}
@Override
public JsonDocumentItemType next() {
if (!this.parser.hasNext())
throw new NoSuchElementException("No more item in JSON document");
OracleJsonParser.Event evt = this.parser.next();
currentKeyName = null;
currentValue = null;
switch (evt) {
case START_OBJECT:
return JsonDocumentItemType.OBJECT_START;
case END_OBJECT:
return JsonDocumentItemType.OBJECT_END;
case START_ARRAY:
return JsonDocumentItemType.ARRAY_START;
case END_ARRAY:
return JsonDocumentItemType.ARRAY_END;
case KEY_NAME:
currentKeyName = this.parser.getString();
return JsonDocumentItemType.VALUE_KEY;
case VALUE_TIMESTAMPTZ:
currentValue = this.parser.getOffsetDateTime();
return JsonDocumentItemType.VALUE;View on GitHub (pinned to fad1729dce)
Solutions
- When driving the reader directly, guard every next() with hasNext()
- Validate the stored documents (Oracle IS JSON check / jsonb validation, or a Jackson parse) and repair malformed rows
- Align the embeddable mapping with the actual document structure - missing keys are fine (nulls), but structural tokens must match
- Catch NoSuchElementException during aggregate reads and rethrow as a data-quality error identifying the row
Example fix
// before
while (true) {
JsonDocumentItemType item = reader.next(); // throws 'No more item in JSON document' at end
}
// after
while (reader.hasNext()) {
JsonDocumentItemType item = reader.next();
} Defensive patterns
Strategy: try-catch
Validate before calling
while (reader.hasNext()) { // guard every next() when driving the reader directly
JsonDocumentItemType item = reader.next();
} Try / catch
try {
MyAgg agg = session.find(MyEntity.class, id).getAgg();
} catch (NoSuchElementException e) {
throw new DataIntegrityViolationException("Truncated/malformed JSON document in row " + id, e);
} Prevention
- Validate JSON columns with a constraint (Oracle IS JSON / PostgreSQL jsonb type) so bad data cannot enter
- Version aggregate document schemas alongside the entities that read them
- Wrap aggregate reads to translate NoSuchElementException into a data-quality error with row identity
When it happens
Trigger: Reading an Oracle JSON aggregate column whose stored document is truncated or shaped differently from the mapping (fewer object/array entries than the embeddable expects), so the adapter calls next() after the parser is exhausted; also direct API misuse (next() without hasNext()).
Common situations: Corrupt or hand-edited JSON/OSON data; documents written by other services with a different schema version; mapping changes across deployments; Oracle OSON round-trips with mixed tooling.
Related errors
- Unsupportd target type
- Unsupportd source type
- Unknown OSON event: {}
- no object key available
- Unsupported numeric type: {}
AI-assisted analysis of hibernate/hibernate-orm@fad1729dce (2026-08-22).
Data as JSON: /api/errors/a1771cbdc401b8bc.
Report an issue: GitHub.