This commit is contained in:
Mikhail Polivakha 2024-03-26 01:15:07 +03:00 committed by GitHub
parent 5fbc3a252b
commit 4912f824c9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 184 additions and 0 deletions

View File

@ -81,6 +81,16 @@
<artifactId>hypersistence-utils-hibernate-60</artifactId>
<version>${hypersistance-utils-hibernate-60.version}</version>
</dependency>
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
<version>${liquibase-core.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependencies>
<properties>
@ -91,6 +101,8 @@
<maven.deploy.skip>true</maven.deploy.skip>
<tomcat-dbcp.version>9.0.0.M26</tomcat-dbcp.version>
<hypersistance-utils-hibernate-60.version>3.3.1</hypersistance-utils-hibernate-60.version>
<lombok.version>1.18.30</lombok.version>
<liquibase-core.version>4.24.0</liquibase-core.version>
</properties>
</project>

View File

@ -4,6 +4,7 @@ import com.baeldung.hibernate.oneToMany.model.Cart;
import com.baeldung.hibernate.oneToMany.model.CartOIO;
import com.baeldung.hibernate.oneToMany.model.Item;
import com.baeldung.hibernate.oneToMany.model.ItemOIO;
import com.baeldung.hibernate.subselect.RuntimeConfiguration;
import org.hibernate.SessionFactory;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
@ -38,6 +39,7 @@ public class HibernateAnnotationUtil {
.addAnnotatedClass(CartOIO.class)
.addAnnotatedClass(Item.class)
.addAnnotatedClass(ItemOIO.class)
.addAnnotatedClass(RuntimeConfiguration.class)
.buildMetadata();
return metadata.buildSessionFactory();

View File

@ -0,0 +1,43 @@
package com.baeldung.hibernate.subselect;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import java.time.Instant;
import lombok.Data;
import lombok.experimental.Accessors;
import org.hibernate.annotations.Subselect;
@Data
@Accessors(chain = true)
@Entity
// language=sql
@Subselect(value =
"SELECT\n"
+ " ss.id,\n"
+ " ss.attr_key,\n"
+ " ss.val,\n"
+ " ss.created_at\n"
+ " FROM system_settings AS ss\n"
+ " INNER JOIN (\n"
+ " SELECT\n"
+ " ss2.attr_key as k2,\n"
+ " MAX(ss2.created_at) as ca2\n"
+ " FROM system_settings ss2\n"
+ " GROUP BY ss2.attr_key\n"
+ " ) AS t ON t.k2 = ss.attr_key AND t.ca2 = ss.created_at\n"
+ " WHERE ss.type = 'SYSTEM' AND ss.active IS TRUE\n")
public class RuntimeConfiguration {
@Id
private Long id;
@Column(name = "attr_key")
private String key;
@Column(name = "val")
private String value;
@Column(name = "created_at")
private Instant createdAt;
}

View File

@ -0,0 +1,55 @@
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.4.xsd">
<changeSet id="4" author="Mikhail Polivakha">
<createTable tableName="system_settings">
<column name="id" type="bigserial" autoIncrement="true">
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="attr_key" type="text">
<constraints nullable="false"/>
</column>
<column name="val" type="text">
<constraints nullable="false"/>
</column>
<column name="type" type="text">
<constraints nullable="false"/>
</column>
<column name="active" type="boolean">
<constraints nullable="false"/>
</column>
<column name="created_at" type="timestamptz">
<constraints nullable="false"/>
</column>
</createTable>
<insert tableName="system_settings">
<column name="id">1</column>
<column name="attr_key">splitting.enabled</column>
<column name="val">true</column>
<column name="active">true</column>
<column name="type">SYSTEM</column>
<column name="created_at" valueComputed="NOW()"/>
</insert>
<insert tableName="system_settings">
<column name="id">2</column>
<column name="attr_key">splitting.enabled</column>
<column name="val">false</column>
<column name="active">false</column>
<column name="type">SYSTEM</column>
<column name="created_at" valueComputed="NOW()"/>
</insert>
<insert tableName="system_settings">
<column name="id">3</column>
<column name="attr_key">redelivery.enabled</column>
<column name="val">false</column>
<column name="active">true</column>
<column name="type">ORDER</column>
<column name="created_at" valueComputed="NOW()"/>
</insert>
</changeSet>
</databaseChangeLog>

View File

@ -0,0 +1,7 @@
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.4.xsd">
<include file="V1__init.xml" relativeToChangelogFile="true" />
</databaseChangeLog>

View File

@ -0,0 +1,65 @@
package com.baeldung.hibernate.subselect;
import com.baeldung.hibernate.oneToMany.config.HibernateAnnotationUtil;
import jakarta.persistence.criteria.Root;
import liquibase.Contexts;
import liquibase.LabelExpression;
import liquibase.Liquibase;
import liquibase.database.DatabaseFactory;
import liquibase.database.jvm.JdbcConnection;
import liquibase.exception.LiquibaseException;
import liquibase.resource.ClassLoaderResourceAccessor;
import org.hibernate.Session;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
public class SubselectIntegrationTest {
@BeforeAll
static void setUp() {
Session currentSession = HibernateAnnotationUtil.getSessionFactory().getCurrentSession();
currentSession.beginTransaction();
currentSession.doWork(it -> {
Liquibase liquibase;
try {
liquibase = new Liquibase(
"migrations/master.xml",
new ClassLoaderResourceAccessor(),
DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(it))
);
liquibase.update(new Contexts(), new LabelExpression(),true);
} catch (LiquibaseException e) {
throw new RuntimeException(e);
}
});
currentSession.getTransaction().commit();
}
@Test
void givenEntityMarkedWithSubselect_whenSelectingRuntimeConfigByKey_thenSelectedSuccessfully() {
String key = "splitting.enabled";
Session entityManager = HibernateAnnotationUtil.getSessionFactory().getCurrentSession();
entityManager.beginTransaction();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<RuntimeConfiguration> query = criteriaBuilder.createQuery(RuntimeConfiguration.class);
Root<RuntimeConfiguration> root = query.from(RuntimeConfiguration.class);
RuntimeConfiguration configurationParameter = entityManager.createQuery(
query.select(root).where(criteriaBuilder.equal(root.get("key"), key))
).getSingleResult();
entityManager.getTransaction().commit();
Assertions.assertThat(configurationParameter.getValue()).isEqualTo("true");
}
}