Skip to content

Do not detect multiple child repositories of base repository class #3944

@Madina-S

Description

@Madina-S

I have two types of entities: ordinary and ordered and two types of repositories accordingly.

@MappedSuperclass
@EntityListeners(AuditingEntityListener::class)
abstract class BaseEntity(
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY) var id: Long = 0,
    @CreatedDate @Temporal(TemporalType.TIMESTAMP) var createdDate: Date? = null,
    @CreatedBy var createdBy: Long? = null,
    @LastModifiedBy var lastModifiedBy: Long? = null,
    @LastModifiedDate @Temporal(TemporalType.TIMESTAMP) var modifiedDate: Date? = null,
    @Column(nullable = false) @ColumnDefault(value = "false") var deleted: Boolean = false
)

@MappedSuperclass
abstract class OrderedBaseEntity(
    var ordered: Int = 0
) : BaseEntity()

@Entity
class Category(
    var title: String,
    var logo: String,
    order: Int = 0
) : OrderedBaseEntity(order)
@NoRepositoryBean
interface JpaBaseRepository<T : BaseEntity> : JpaRepository<T, Long>, JpaSpecificationExecutor<T> {
    @Modifying
    @Transactional
    @Query("UPDATE #{#entityName} e SET e.deleted = true WHERE e.id IN :ids AND e.deleted = false")
    fun trashAllByIds(ids: List<Long>) = 0

    fun findByIdAndDeletedFalse(id: Long): T?
    fun trash(id: Long): T?
    fun findAllNotDeleted(): List<T>
    fun findAllNotDeletedPage(pageable: Pageable): Page<T>
}

@NoRepositoryBean
interface JpaOrderedBaseRepository<T : OrderedBaseEntity> : JpaBaseRepository<T> {
    fun findOrderedActive(): List<T>
}

class JpaBaseRepositoryImpl<T : BaseEntity>(
    entityInformation: JpaEntityInformation<T, Long>,
    entityManager: EntityManager
) : SimpleJpaRepository<T, Long>(entityInformation, entityManager), JpaBaseRepository<T> {

    val isNotDeletedSpecification = Specification<T> { root, _, cb -> cb.equal(root.get<Boolean>("deleted"), false) }

    override fun findByIdAndDeletedFalse(id: Long) = findByIdOrNull(id)?.run { if (deleted) null else this }

    @Transactional
    override fun trash(id: Long): T? = findByIdOrNull(id)?.run {
        deleted = true
        save(this)
    }

    override fun findAllNotDeleted(): List<T> = findAll(isNotDeletedSpecification)
    override fun findAllNotDeletedPage(pageable: Pageable): Page<T> = findAll(isNotDeletedSpecification, pageable)
}

class JpaBaseOrderedRepositoryImpl<T : OrderedBaseEntity>(
    entityInformation: JpaEntityInformation<T, Long>,
    entityManager: EntityManager
) : JpaBaseRepositoryImpl<T>(entityInformation, entityManager), JpaOrderedBaseRepository<T> {

    override fun findOrderedActive(): List<T> =
        findAll(isNotDeletedSpecification, Sort.by(Sort.Direction.ASC, "ordered"))
}

@Repository
interface CategoryRepository : JpaOrderedBaseRepository<Category>
@EnableJpaRepositories(repositoryBaseClass = JpaBaseRepositoryImpl::class)
@SpringBootApplication
class CoreApplication

Error is : Failed to create query for method public abstract java.util.List pro.talim.beta.core.common.JpaOrderedBaseRepository.findOrderedActive(); No property 'findOrderedActive' found for type 'Category'

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions