From 9b1acbedca70233d39f097d5343ee6a682526366 Mon Sep 17 00:00:00 2001 From: Azhwani Date: Fri, 19 Sep 2025 19:26:26 +0200 Subject: [PATCH] BAEL-9408: Resolving Hibernate SyntaxException: token '*', no viable alternative --- .../syntaxexception/HibernateUtil.java | 39 +++++++++++++++ .../hibernate/syntaxexception/Person.java | 23 +++++++++ .../SyntaxExceptionUnitTest.java | 49 +++++++++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 persistence-modules/hibernate-exceptions-2/src/main/java/com/baeldung/hibernate/syntaxexception/HibernateUtil.java create mode 100644 persistence-modules/hibernate-exceptions-2/src/main/java/com/baeldung/hibernate/syntaxexception/Person.java create mode 100644 persistence-modules/hibernate-exceptions-2/src/test/java/com/baeldung/hibernate/syntaxexception/SyntaxExceptionUnitTest.java diff --git a/persistence-modules/hibernate-exceptions-2/src/main/java/com/baeldung/hibernate/syntaxexception/HibernateUtil.java b/persistence-modules/hibernate-exceptions-2/src/main/java/com/baeldung/hibernate/syntaxexception/HibernateUtil.java new file mode 100644 index 000000000000..de64c4600e65 --- /dev/null +++ b/persistence-modules/hibernate-exceptions-2/src/main/java/com/baeldung/hibernate/syntaxexception/HibernateUtil.java @@ -0,0 +1,39 @@ +package com.baeldung.hibernate.syntaxexception; + +import java.util.HashMap; +import java.util.Map; + +import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.service.ServiceRegistry; + +public class HibernateUtil { + private static SessionFactory sessionFactory; + + public static SessionFactory getSessionFactory() { + if (sessionFactory == null) { + Map settings = new HashMap<>(); + settings.put("hibernate.connection.driver_class", "org.h2.Driver"); + settings.put("hibernate.connection.url", "jdbc:h2:mem:test"); + settings.put("hibernate.connection.username", "sa"); + settings.put("hibernate.connection.password", ""); + settings.put("hibernate.dialect", "org.hibernate.dialect.H2Dialect"); + settings.put("hibernate.show_sql", "true"); + settings.put("hibernate.hbm2ddl.auto", "update"); + + ServiceRegistry standardRegistry = new StandardServiceRegistryBuilder().applySettings(settings) + .build(); + + Metadata metadata = new MetadataSources(standardRegistry).addAnnotatedClass(Person.class) + .getMetadataBuilder() + .build(); + + sessionFactory = metadata.getSessionFactoryBuilder() + .build(); + } + + return sessionFactory; + } +} \ No newline at end of file diff --git a/persistence-modules/hibernate-exceptions-2/src/main/java/com/baeldung/hibernate/syntaxexception/Person.java b/persistence-modules/hibernate-exceptions-2/src/main/java/com/baeldung/hibernate/syntaxexception/Person.java new file mode 100644 index 000000000000..ef10ab6f0148 --- /dev/null +++ b/persistence-modules/hibernate-exceptions-2/src/main/java/com/baeldung/hibernate/syntaxexception/Person.java @@ -0,0 +1,23 @@ +package com.baeldung.hibernate.syntaxexception; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; + +@Entity +public class Person { + + @Id + private int id; + private String firstName; + private String lastName; + + public Person() { + } + + public Person(int id, String firstName, String lastName) { + this.id = id; + this.firstName = firstName; + this.lastName = lastName; + } + +} diff --git a/persistence-modules/hibernate-exceptions-2/src/test/java/com/baeldung/hibernate/syntaxexception/SyntaxExceptionUnitTest.java b/persistence-modules/hibernate-exceptions-2/src/test/java/com/baeldung/hibernate/syntaxexception/SyntaxExceptionUnitTest.java new file mode 100644 index 000000000000..fce6de81e6a8 --- /dev/null +++ b/persistence-modules/hibernate-exceptions-2/src/test/java/com/baeldung/hibernate/syntaxexception/SyntaxExceptionUnitTest.java @@ -0,0 +1,49 @@ +package com.baeldung.hibernate.syntaxexception; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.util.List; + +import org.hibernate.Session; +import org.hibernate.query.SyntaxException; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +class SyntaxExceptionUnitTest { + + private static Session session; + + @BeforeAll + static void beforeAll() { + session = HibernateUtil.getSessionFactory() + .openSession(); + session.beginTransaction(); + } + + @AfterAll + static void afterAll() { + session.close(); + } + + @Test + void whenUsingInvalidHQLSyntax_thenThrowSyntaxException() { + assertThatThrownBy(() -> { + session.createQuery("SELECT * FROM Person p", Person.class) + .list(); + }).hasRootCauseInstanceOf(SyntaxException.class) + .hasMessageContaining("token '*', no viable alternative"); + } + + @Test + void whenUsingValidHQLSyntax_thenCorrect() { + Person person = new Person(1, "Jane", "Austen"); + session.persist(person); + + List personList = session.createQuery("SELECT p FROM Person p", Person.class).list(); + + assertThat(personList).contains(person); + } + +}