diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/OraclePersistenceContext.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/OraclePersistenceContext.java index d49afa29b4..99b5ebacf3 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/OraclePersistenceContext.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/OraclePersistenceContext.java @@ -103,9 +103,8 @@ public RealmSearchDAO realmSearchDAO( public PlainSchemaRepoExt plainSchemaRepoExt( final AnyUtilsFactory anyUtilsFactory, final @Lazy ExternalResourceDAO resourceDAO, - final @Lazy PlainSchemaDAO plainSchemaDAO, final EntityManager entityManager) { - return new OraclePlainSchemaRepoExtImpl(anyUtilsFactory, resourceDAO, plainSchemaDAO, entityManager); + return new OraclePlainSchemaRepoExtImpl(anyUtilsFactory, resourceDAO, entityManager); } } diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/repo/OraclePlainSchemaRepoExtImpl.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/repo/OraclePlainSchemaRepoExtImpl.java index d7f253165b..51050bb4f8 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/repo/OraclePlainSchemaRepoExtImpl.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/repo/OraclePlainSchemaRepoExtImpl.java @@ -22,8 +22,6 @@ import jakarta.persistence.Query; import org.apache.commons.lang3.StringUtils; import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO; -import org.apache.syncope.core.persistence.api.dao.NotFoundException; -import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO; import org.apache.syncope.core.persistence.api.entity.AnyUtils; import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory; import org.apache.syncope.core.persistence.api.entity.PlainAttrValue; @@ -37,16 +35,12 @@ public class OraclePlainSchemaRepoExtImpl extends AbstractPlainSchemaRepoExt { protected static final String HAS_ATTRS_QUERY = "SELECT COUNT(id) AS counts FROM %TABLE% " + "WHERE JSON_EXISTS(plainAttrs, '$[*]?(@.schema == \"%SCHEMA%\")')"; - protected final PlainSchemaDAO plainSchemaDAO; - public OraclePlainSchemaRepoExtImpl( final AnyUtilsFactory anyUtilsFactory, final ExternalResourceDAO resourceDAO, - final PlainSchemaDAO plainSchemaDAO, final EntityManager entityManager) { super(anyUtilsFactory, resourceDAO, entityManager); - this.plainSchemaDAO = plainSchemaDAO; } @Override @@ -54,22 +48,38 @@ public boolean hasAttrs(final PlainSchema schema) { return hasAttrs(schema, HAS_ATTRS_QUERY, StringUtils.EMPTY); } + protected boolean existsPlainAttrUniqueValue( + final String table, + final PlainSchema schema, + final String attrValue, + final String attrKey) { + + String queryString = new StringBuilder("SELECT COUNT(id) FROM ").append(table). + append(" WHERE "). + append("JSON_EXISTS(plainAttrs, '$[*]?(@.schema == \"").append(schema.getKey()).append("\" "). + append("&& @.uniqueValue.").append(OracleJPAAnySearchDAO.key(schema.getType())).append(" == $value)' "). + append("PASSING ?1 AS \"value\") AND id <> ?2"). + toString(); + + Query query = entityManager.createNativeQuery(queryString); + + query.setParameter(1, attrValue); + query.setParameter(2, attrKey); + + return ((Number) query.getSingleResult()).longValue() > 0; + } + @Override public boolean existsPlainAttrUniqueValue( final String realmKey, final PlainSchema schema, final PlainAttrValue attrValue) { - Query query = entityManager.createNativeQuery( - "SELECT COUNT(id) FROM " - + JPARealm.TABLE + "," - + OracleJPAAnySearchDAO.from(plainSchemaDAO.findById(schema.getKey()). - orElseThrow(() -> new NotFoundException("PlainSchema " + schema.getKey()))) - + " WHERE " + schema.getKey() + ".uniqueValue=?1 AND id <> ?2"); - query.setParameter(1, attrValue.getValue()); - query.setParameter(2, realmKey); - - return ((Number) query.getSingleResult()).longValue() > 0; + return existsPlainAttrUniqueValue( + JPARealm.TABLE, + schema, + attrValue.getValue().toString(), + realmKey); } @Override @@ -79,15 +89,10 @@ public boolean existsPlainAttrUniqueValue( final PlainSchema schema, final PlainAttrValue attrValue) { - Query query = entityManager.createNativeQuery( - "SELECT COUNT(id) FROM " - + new SearchSupport(anyUtils.anyTypeKind()).table().name() + "," - + OracleJPAAnySearchDAO.from(plainSchemaDAO.findById(schema.getKey()). - orElseThrow(() -> new NotFoundException("PlainSchema " + schema.getKey()))) - + " WHERE " + schema.getKey() + ".uniqueValue=?1 AND id <> ?2"); - query.setParameter(1, attrValue.getValue()); - query.setParameter(2, anyKey); - - return ((Number) query.getSingleResult()).longValue() > 0; + return existsPlainAttrUniqueValue( + new SearchSupport(anyUtils.anyTypeKind()).table().name(), + schema, + attrValue.getValue().toString(), + anyKey); } }