首页 文章

没有主SDN标签..(即以_开头的标签)

提问于
浏览
0

Spring data neo4j version: 3.3.0.RELEASE Neo4j version: 2.2.2

当我尝试查询spring-data存储库中公开的默认方法时,我遇到了以下异常,即

personRepository.findAll(getDefaultPageable());

public static Pageable getDefaultPageable() {
    BiFunction<Integer, Integer, Pageable> biFunction = PageRequest::new; // Method reference syntax in action
    return biFunction.apply(DEFAULT_PAGE_NUMBER, DEFAULT_PAGE_SIZE);
}

引起:java.lang.IllegalStateException:org.springframework.data.neo4j.support.typerepresentation.LabelBasedNodeTypeRepresentationStrategy.readAliasFrom(LabelBasedNodeTypeRepresentationStrategy.java:136)org中没有主SDN标签(即以_开头的标签) . springframework.data.neo4j.support.typerepresentation.LabelBasedNodeTypeRepresentationStrategy.readAliasFrom(LabelBasedNodeTypeRepresentationStrategy.java:40)org.springframework.data.neo4j.support.mapping.TRSTypeAliasAccessor.readAliasFrom(TRSTypeAliasAccessor.java:36)org.springframework.data . 位于org.springframework.data.convert.DefaultTypeMapper.getDefaultedTypeToBeUsed的Org.springframework.data.convert.DefaultTypeMapper.readType(DefaultTypeMapper.java:102)中的neo4j.support.mapping.TRSTypeAliasAccessor.readAliasFrom(TRSTypeAliasAccessor.java:26)(DefaultTypeMapper . java:165)在org.springframework.data.neo4j.support.map的org.springframework.data.convert.DefaultTypeMapper.readType(DefaultTypeMapper.java:142) ping.Neo4jEntityConverterImpl.read(Neo4jEntityConverterImpl.java:77)位于org.springframework.data.neo4j.support.mapping的org.springframework.data.neo4j.support.mapping.Neo4jEntityPersister $ CachedConverter.read(Neo4jEntityPersister.java:170) . Neo4jEntityPersister.createEntityFromState(Neo4jEntityPersister.java:189)在org.springframework.data.neo4j.support.mapping.Neo4jEntityPersister.projectTo(Neo4jEntityPersister.java:216)在org.springframework.data.neo4j.support.Neo4jTemplate.projectTo(Neo4jTemplate . java:241)org.springframework.data.neo4j.support.conversion.EntityResultConverter.doConvert(EntityResultConverter.java:73)org.springframework.data.neo4j.conversion.DefaultConverter.convert(DefaultConverter.java:44)at org .springframework.data.neo4j.support.conversion.EntityResultConverter.convert(EntityResultConverter.java:165)位于org.neo4j.helpers的org.springframework.data.neo4j.conversion.QueryResultBuilder $ 1.underlyingObjectToObject(QueryResultBuilder.java:86) . collection.Iter org.springframework.data.neo4j.repository.AbstractGraphRepository.subList(AbstractGraphRepository.java:org.neo4j.helpers.collection.IteratorWrapper.next(IteratorWrapper.java:47)中的ableWrapper $ MyIteratorWrapper.underlyingObjectToObject(IterableWrapper.java:57) 371)atg.springframework.data.neo4j.repository.AbstractGraphRepository.extractPage(AbstractGraphRepository.java:355)atg.springframework.data.neo4j.repository.AbstractGraphRepository.findAll(AbstractGraphRepository.java:321)at sun.reflect.NativeMethodAccessorImpl .invoke0(本机方法)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java) :497)org.springframework.data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:414)org.springframework.data.repository.core.support.Repositor yFactorySupport $ QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:399)在org.springframework.data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:371)在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(在org.springframework.transaction的org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)的org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:61)中的ReflectiveMethodInvocation.java:179) .interceptor.TransactionInterceptor $ 1.proceedWithInvocation(TransactionInterceptor.java:99)org.springframework.transaction.intercts.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java: 96)在org.springframework.aop.framework.Refle ctiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)位于org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)at atorg.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)在org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)在com.sun.proxy . $ Proxy60.findAll(未知源)在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)在java.lang.reflect中.Method.invoke(Method.java:497)在org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)在org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:201)在com.sun.proxy . $ Proxy61.findAll(Unknown Source)

我真的不想在这里做任何复杂的事情,所以我很难理解我是否应该真正引入带有下划线前缀标签的自定义查询并使用注释@Query吗? Spring数据的默认方法是否只适用于SDN?


##更新##

I adapted the cypher query and still ended up with the same error .

使用:java.lang.IllegalStateException:没有初级SDN标签存在..(即,一个开始_)在org.springframework.data.neo4j.support.typerepresentation.LabelBasedNodeTypeRepresentationStrategy.readAliasFrom(LabelBasedNodeTypeRepresentationStrategy.java:136)在有机springframework.data.neo4j.support.typerepresentation.LabelBasedNodeTypeRepresentationStrategy.readAliasFrom(LabelBasedNodeTypeRepresentationStrategy.java:40)org.springframework.data.neo4j.support.mapping.TRSTypeAliasAccessor.readAliasFrom(TRSTypeAliasAccessor.java:36)org.springframework.data . neo4j.support.mapping.TRSTypeAliasAccessor.readAliasFrom(TRSTypeAliasAccessor.java:26)在org.springframework.data.convert.DefaultTypeMapper.readType(DefaultTypeMapper.java:102)在org.springframework.data.convert.DefaultTypeMapper.getDefaultedTypeToBeUsed(DefaultTypeMapper . java:165)org.springframework.data.convert.DefaultTypeMapper.readType(DefaultTypeMapper.java:142)at org.springframework.data.neo4j.support.mappi ng.Neo4jEntityConverterImpl.read(Neo4jEntityConverterImpl.java:77)在org.springframework.data.neo4j.support.mapping.Neo4jEntityPersister $ CachedConverter.read(Neo4jEntityPersister.java:170)在org.springframework.data.neo4j.support.mapping . 在org.springframework.data.neo4j.support.Neo4jTemplate.createEntityFromState(Neo4jTemplate.java:224)的Neo4jEntityPersister.createEntityFromState(Neo4jEntityPersister.java:189)

你能不能看看课程,让我知道我在哪里做错了什么?

这是存储库类

public interface PersonRepository extends GraphRepository<Person>, CypherDslRepository<Person> {
String PERSONS_WITH_SEVERAL_ACME_IDENTITY = "MATCH (p:Person)-[r:HAS_LOGIN]->(a:AcmeIdp) " +
        "SET p:_Person, a:_AcmeIdp "+
        "WITH p, count(p) AS numoutgoing " +
        "WHERE numoutgoing > 1 " +
        "MATCH (p:Person)-[r:HAS_LOGIN]->(a:AcmeIdp) " +
        "SET p:_Person, a:_AcmeIdp "+
        "RETURN p";

Iterable<Person> findByFirstNameAndLastName(@NonNull final String firstName,@NonNull final String lastName);

Page<Person> findByFirstNameLike(@NonNull final String firstName,@NonNull final Pageable pageable);

@Query(PERSONS_WITH_SEVERAL_ACME_IDENTITY)
Page<Person> findOnesWithSeveralAcmeIdentities(@NonNull final Pageable pageable); }

人实体类

import com.example.analytics.model.AbstractEntity;
import com.example.analytics.model.relationship.Login;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.neo4j.graphdb.Direction;
import org.springframework.data.neo4j.annotation.*;

import java.time.LocalDateTime;
import java.util.Set;

@NodeEntity(useShortNames = true)
public class Person extends AbstractEntity {

    @GraphProperty(propertyName = "title", defaultValue = "")
    private String title;

    @GraphProperty(propertyName = "firstName", defaultValue = "")
    private String firstName;

    @GraphProperty(propertyName = "lastName", defaultValue = "")
    private String lastName;

    @GraphProperty(propertyName = "dateOfBirth", propertyType = String.class)
    private LocalDateTime dateOfBirth;

    @RelatedTo(type = "HAS_LOGIN", direction = Direction.OUTGOING, elementClass = AcmeIdentity.class)
    private Set<Login> logins;

    public String getTitle() {
        return title;
    }

    public void setTitle(final String title) {
        this.title = title;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(final String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(final String lastName) {
        this.lastName = lastName;
    }

    public LocalDateTime getDateOfBirth() {
        return dateOfBirth;
    }

    public void setDateOfBirth(final LocalDateTime dateOfBirth) {
        this.dateOfBirth = dateOfBirth;
    }

    public Set<Login> getLogins() {
        return logins;
    }

    public void setLogins(@NonNull final Set<Login> logins) {
        this.logins = logins;
    }
}

转换器

import org.checkerframework.checker.nullness.qual.NonNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Component
public class LocalDateTimeToStringConverter implements Converter<LocalDateTime, String> {

    private static final Logger LOG = LoggerFactory.getLogger(LocalDateTimeToStringConverter.class);

    @Value("${neo4j.dateTime.format:yyyy-MM-dd HH:mm:ss}")
    private String dateTimeFormat;

    @Override
    public String convert(@NonNull final LocalDateTime source) {
        LOG.debug("Converting LocalDateTime into String using the format: {}", dateTimeFormat);
        return String.valueOf(source.format(DateTimeFormatter.ofPattern(dateTimeFormat)));
    }

}

反向转换器

import org.checkerframework.checker.nullness.qual.NonNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Component
public class StringToLocalDateTimeConverter implements Converter<String, LocalDateTime> {

    private static final Logger LOG = LoggerFactory.getLogger(StringToLocalDateTimeConverter.class);

    @Value("${neo4j.dateTime.format:yyyy-MM-dd HH:mm:ss}")
    private String dateTimeFormat;

    /**
     * Convert the source of type S to target type T.
     *
     * @param source the source object to convert, which must be an instance of S (never {@code null})
     * @return the converted object, which must be an instance of T (potentially {@code null})
     * @throws IllegalArgumentException if the source could not be converted to the desired target type
     */
    @Override
    public LocalDateTime convert(@NonNull final String source) {
        LOG.debug("Converting String {} into LocalDateTime using the format: {}",source, dateTimeFormat);
        return LocalDateTime.parse(source, DateTimeFormatter.ofPattern(dateTimeFormat));
    }

}

主配置类

import com.example.analytics.converter.LocalDateTimeToStringConverter;
import com.example.analytics.converter.StringToLocalDateTimeConverter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.*;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.convert.ConversionService;
import org.springframework.core.convert.converter.ConverterRegistry;
import org.springframework.data.neo4j.config.Neo4jConfiguration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableAutoConfiguration
@EnableTransactionManagement(mode = AdviceMode.PROXY)
@ComponentScan(basePackages = {"com.example.analytics"})
@PropertySource(value = "classpath:application.yml", ignoreResourceNotFound = false)
@Import({DatabaseConnectionConfiguration.class})
public class MainConfiguration extends Neo4jConfiguration {

    @Autowired
    private StringToLocalDateTimeConverter stringToLocalDateTimeConverter;

    @Autowired
    private LocalDateTimeToStringConverter localDateTimeToStringConverter;

    private static final Logger LOG = LoggerFactory.getLogger(MainConfiguration.class);

    public MainConfiguration() {
        setBasePackage("com.example.analytics.model");
    }

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertyConfigIn() {
        return new PropertySourcesPlaceholderConfigurer();
    }

    @Bean
    @DependsOn({ "stringToLocalDateTimeConverter", "localDateTimeToStringConverter" })
    protected ConversionService neo4jConversionService() throws Exception {
        LOG.debug("Adding custom converters to conversion service ...");
        ConversionService conversionService = super.neo4jConversionService();
        ConverterRegistry registry = (ConverterRegistry) conversionService;
        registry.addConverter(stringToLocalDateTimeConverter);
        registry.addConverter(localDateTimeToStringConverter);
        LOG.debug("Addition of Converter from LocalDateTime to String and vice-versa has been completed!");
        return conversionService;
    }
}

使用存储库的服务片段

public Page<Person> findPersonsWithSeveralAcmeIdentitites(final Pageable pageable) {
    LOG.debug("Fetching persons with several ACME identities");

    if(pageable != null)
        return personRepository.findOnesWithSeveralAcmeIdentities(pageable);
   else 
        return personRepository.findOnesWithSeveralAcmeIdentities(getDefaultPageable());

}

1 回答

  • 1

    然后,您必须遍历您的节点,并在每个节点上调用:

    neo4jTemplate.postEntityCreation(node, MyEntity.class);
    

    或者这也应该工作:

    MATCH (n:User) set n:_User;
    

    等等

    I think you're overdoing Java8 method references !!! Just use plain old new. Otherwise your code will be unmaintainable going forward.

    public static Pageable getDefaultPageable() {
        return new PageRequest(DEFAULT_PAGE_NUMBER, DEFAULT_PAGE_SIZE);
    }
    

相关问题