簡體   English   中英

訪問自定義存儲庫實現中的JpaEntityInformation

[英]Access JpaEntityInformation in custom repository implementation

我有一些Spring Data存儲庫,通過這里描述的片段進行擴展。 只要我在這個實現中只注入EntityManager ,這就可以正常工作。

其中一個實現是通用的,因此需要一個JpaEntityInformation實例,以使當前實體正常工作(我基本上只需要實體名稱和java類型)。 如果我嘗試在構造函數中“自動”這個,我得到一個異常,說明找不到類JpaEntityInformation bean。

我理解這個異常,但我想知道是否有另一種方法來獲取為當前存儲庫實例創建的實體的名稱和類。 我認為應該可以通過構造函數以某種方式獲取JpaEntityInformation ,因為如果您指定自定義存儲庫基類(我不想這樣做),這就是它的完成方式。

下面你可以找到我剛才描述的用例。

@NoRepositoryBean
@RequiredArgsConstructor
public class FindByFieldRepositoryImpl<T> implements FindByFieldRepository<T> {

    private final JpaEntityInformation<T, ?> entityInformation;
    private final EntityManager manager;

    @Override
    public T findByField(String field, Object value) {
        return createQuery(field, value).getSingleResult();
    }

    private TypedQuery<T> createQuery(String fieldName, Object fieldValue) {
        String entityName = entityInformation.getEntityName();
        Class<T> entityType = entityInformation.getJavaType();

        String queryString = String.format("FROM %s WHERE %s = :value", entityName, fieldName);
        TypedQuery<T> query = manager.createQuery(queryString, entityType);
        return query.setParameter("value", fieldValue);
    }
}

您可以使用JpaEntityInformationSupport從其類中獲取實體信息。 以下是您的代碼的外觀:

@NoRepositoryBean
@RequiredArgsConstructor
public class FindByFieldRepositoryImpl<T> implements FindByFieldRepository<T> {

    private final EntityManager manager;

    @Override
    public T findByField(String field, Object value, Class<T> clazz) {
        return createQuery(field, value, clazz).getSingleResult();
    }

    private TypedQuery<T> createQuery(String fieldName, Object fieldValue, Class<T> clazz) {
        JpaEntityInformation entityInformation = JpaEntityInformationSupport.getEntityInformation(clazz, manager);
        String entityName = entityInformation.getEntityName();
        Class<T> entityType = entityInformation.getJavaType();

        String queryString = String.format("FROM %s WHERE %s = :value", entityName, fieldName);
        TypedQuery<T> query = manager.createQuery(queryString, entityType);
        return query.setParameter("value", fieldValue);
    }
}

我沒有測試過這段代碼,但它應該可行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM