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

    Labels

    status: feedback-reminderWe've sent a reminder that we need additional information before we can continuestatus: waiting-for-feedbackWe need additional information before we can continuestatus: waiting-for-triageAn issue we've not yet triaged

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions