Use Bind Parameters in Hibernate Queries

ID

java.hibernate_bind_parameters_in_queries

Severity

high

Remediation Complexity

trivial

Remediation Risk

low

Remediation Effort

low

Resource

Reliability

Language

Java

Tags

CWE:89, hibernate, orm, reliability, sql

Description

Reports calls to createQuery, createNativeQuery, createNamedQuery, or createSQLQuery where the first argument is a string-concatenation expression containing non-literal operands. Building queries with string concatenation bypasses the query plan cache, introduces SQL/HQL injection risk, and loses type safety.

Rationale

When a query string is assembled via + with variables, every invocation produces a different query string, preventing the JPA provider from caching the parsed query plan. More critically, unsanitized input can alter the query’s semantics.

// Bad: string concatenation in query
em.createQuery("SELECT u FROM User u WHERE u.name = '" + name + "'");

// Bad: native query with concatenated table name
em.createNativeQuery("SELECT * FROM " + table);

Remediation

Use positional or named bind parameters and setParameter():

// Good: bind parameter
em.createQuery("SELECT u FROM User u WHERE u.name = :name")
  .setParameter("name", name);

// Good: native query with bind parameter
em.createNativeQuery("SELECT * FROM users WHERE id = ?1")
  .setParameter(1, id);