0

我正在使用 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返回的实例,或者null

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

但是,如果我更改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 接口?

4

1 回答 1

0

remigio 是对的,它返回一个您必须转换的包装对象。

但是,对于不同的实体类型使用通用基类是不可能的。

原因如下:

您会认为为带有注释的查询结果创建一个包装类@MapResult应该可以工作,例如。

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

并在您的存储库类中像这样使用它:

ResultMap<T> findByEntityId(Long id);

在你的测试中像这样:

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

不幸的是,这不起作用,原因有两个:

  • 存储库返回NodeProxy映射内的类而不是 UserNode
  • @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 点,这也不起作用:(

于 2013-07-20T08:33:36.610 回答