hibernate/hibernate-orm · error · UnsupportedOperationException

format() function not supported on Sybase

Error message

format() function not supported on Sybase

What it means

appendDatetimeFormat is called whenever Hibernate renders the pattern of a datetime formatting function, i.e. the HQL format() function. SybaseLegacyDialect (Sybase ASE) throws UnsupportedOperationException because ASE's CONVERT styles cannot express arbitrary Java-style format patterns, so any query using format() fails during SQL translation.

Source

Thrown at hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/SybaseLegacyDialect.java:507

	public boolean supportsFractionalTimestampArithmetic() {
		return false;
	}

	@Override
	public String timestampaddPattern(TemporalUnit unit, TemporalType temporalType, IntervalType intervalType) {
		//TODO!!
		return "dateadd(?1,?2,?3)";
	}

	@Override
	public String timestampdiffPattern(TemporalUnit unit, TemporalType fromTemporalType, TemporalType toTemporalType) {
		//TODO!!
		return "datediff(?1,?2,?3)";
	}

	@Override
	public void appendDatetimeFormat(SqlAppender appender, String format) {
		throw new UnsupportedOperationException( "format() function not supported on Sybase");
	}

	@Override
	public boolean supportsStandardCurrentTimestampFunction() {
		return false;
	}

	@Override
	public IdentifierHelper buildIdentifierHelper(IdentifierHelperBuilder builder, DatabaseMetaData metadata)
			throws SQLException {
		if ( metadata == null ) {
			builder.setUnquotedCaseStrategy( IdentifierCaseStrategy.MIXED );
			builder.setQuotedCaseStrategy( IdentifierCaseStrategy.MIXED );
		}

		return super.buildIdentifierHelper( builder, metadata );
	}

View on GitHub (pinned to fad1729dce)

Solutions

  1. Format in Java after fetching (DateTimeFormatter) instead of in the query
  2. Use extraction functions ASE supports: year(e.created), month(e.created), day(e.created)
  3. Extend SybaseLegacyDialect and override appendDatetimeFormat to map a subset of patterns to convert(varchar, x, style)
  4. Use a native query with ASE convert(varchar, datecol, style)

Example fix

// before
List<String> days = em.createQuery(
    "select format(e.created, 'yyyy-MM-dd') from Event e", String.class).getResultList();

// after: format in Java
List<LocalDateTime> created = em.createQuery(
    "select e.created from Event e", LocalDateTime.class).getResultList();
String day = created.get(0).format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
Defensive patterns

Strategy: fallback

Validate before calling

// Guard: do not emit format() when the dialect cannot render datetime patterns
Dialect d = sessionFactory.getJdbcServices().getDialect();
boolean canFormat = !(d instanceof SybaseLegacyDialect);
// if (!canFormat) fetch raw timestamps and format with DateTimeFormatter in Java

Try / catch

try {
    return em.createQuery("select format(e.created,'yyyy-MM-dd') from Event e", String.class)
             .getResultList();
} catch (UnsupportedOperationException e) {
    if (e.getMessage() != null && e.getMessage().contains("format()")) {
        return formatInJava(em.createQuery("select e.created from Event e", LocalDateTime.class)
                             .getResultList());
    }
    throw e;
}

Prevention

When it happens

Trigger: HQL such as `select format(e.created, 'yyyy-MM-dd') from Event e` (or Criteria format() calls) executed with SybaseLegacyDialect; anything else that routes a datetime format pattern through appendDatetimeFormat.

Common situations: Applications ported from Oracle/MySQL where to_char/format work; date truncation/grouping done via formatting in the query; Hibernate 5 to 6 migrations that previously used custom dialect tweaks.

Related errors


AI-assisted analysis of hibernate/hibernate-orm@fad1729dce (2026-08-22). Data as JSON: /api/errors/cd7b3184a8925e15. Report an issue: GitHub.