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..d4230d8bbaff --- /dev/null +++ b/persistence-modules/hibernate-exceptions-2/src/main/java/com/baeldung/hibernate/syntaxexception/Person.java @@ -0,0 +1,14 @@ +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; + +} 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..d5c78a406122 --- /dev/null +++ b/persistence-modules/hibernate-exceptions-2/src/test/java/com/baeldung/hibernate/syntaxexception/SyntaxExceptionUnitTest.java @@ -0,0 +1,45 @@ +package com.baeldung.hibernate.syntaxexception; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +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; + +import com.baeldung.hibernate.exception.persistentobject.HibernateUtil; + +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() { + assertThat(session.createQuery("SELECT p FROM Person p", Person.class) + .list()).isEmpty(); + } + +}