BAEL-6174 (#16213)
This commit is contained in:
parent
5fbc3a252b
commit
4912f824c9
@ -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>
|
@ -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();
|
||||
|
@ -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;
|
||||
}
|
@ -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>
|
@ -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>
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user