簡體   English   中英

Spring Data / Neo4J存儲庫:findByXXX返回Map,而不是Entity

[英]Spring Data / Neo4J Repository : findByXXX returns Map, not Entity

我正在使用Spring Data Neo4J。

我擴展了基本的GraphRepository接口,添加了一種方法,如下所示:

/**
 * Extension to the repository interface for standard Spring Data repo's that
 * perform operations on graph entities that have a related RDBMS entity.
 * 
 * @author martypitt
 *
 * @param <T>
 */
public interface RelatedEntityRepository<T> extends GraphRepository<T>, 
RelationshipOperationsRepository<T>,CypherDslRepository<T>  {
    public T findByEntityId(Long id);
}

但是,我發現此接口的子類的行為不符合預期。

public interface UserRepository extends RelatedEntityRepository<UserNode>{
}

當我調用UserRepository.findByEntityId(1L) ,我希望返回一個UserNode實例, UserNode返回null

相反,我得到一個scala.collection.JavaConversions$MapWrapper

但是,如果我更改UserRepository以指定類型,則一切正常(盡管UserRepository了基類的目的)

public interface UserRepository extends RelatedEntityRepository<UserNode>{
    public UserNode findByEntityId(Long id);
}

這是一個測試:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"/graph-test-context.xml"})
@Transactional
public class UserRepositoryTests {

    @Autowired
    private UserRepository userRepository;

    // For Bug
    @Test
    public void canFindByEntityId()
    {
        UserNode userNode = new UserNode(1L);
        userRepository.save(userNode);

        UserNode node = userRepository.findByEntityId(1L);
        assertThat(node, notNullValue());
        assertThat(node, isA(UserNode.class));
    }
}

在UserRepository中多余的行被注釋掉的情況下運行此測試失敗。 否則,測試通過。

這是錯誤嗎? 我是否正確編寫了repo接口?

remigio是正確的,它返回一個包裝的對象,您必須將其轉換。

但是,對於不同的實體類型,使用通用的基類是不可能的。

原因如下:

您可能會認為,為帶有@MapResult注釋的查詢結果創建包裝器類應該有效,例如。

@MapResult
public interface ResultMap<T> {
    @ResultColumn("usernode") <T> getNode();
}

並在存儲庫類中像這樣使用它:

ResultMap<T> findByEntityId(Long id);

就像這樣在您的測試中:

ReultMap<UserNode> = userRepository.findByEntityId(1L);

不幸的是,這不起作用,原因有兩個:

  • 存儲庫在地圖內返回NodeProxy類,而不是NodeProxy
  • @ResultColumn批注必須配置一個列名,該列名似乎是根據類“ usernode”的類型在結果中自動生成的。

然后起作用的是:

@MapResult
public interface ResultMap {
    @ResultColumn("usernode") NodeProxy getNode();
}

ResultMap rm = userRepository.findByEntityId(1L);
NodeProxy proxy = rm.getNode();
UserNode userNode = template.convert(proxy, UserNode.class);

template是自動連線的,如下所示:

@Autowired Neo4jOperations template;

不幸的是,由於上述第2點,這實際上也不起作用:(

暫無
暫無

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

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