2015-08-28 61 views
0

我使用Spring Data Neo4j,我有两个实体,PersonPhoneNumberPersonPhoneNumber有1-N的关系。我正在寻找一种以特定顺序始终保持这种关系的方式。Spring Data Neo4j:按特定顺序关系

这里是我的实体的定义(这些都是Groovy类):

@NodeEntity 
class Person { 
    @GraphId Long id 
    String name 
    @RelatedToVia 
    Set<NumberRel> numbers 
} 

@RelationshipEntity(type = "has_number") 
class NumberRel { 
    @GraphId Long id 
    @StartNode Person person 
    @EndNode PhoneNumber number 
    int sequence 
} 

@NodeEntity 
class PhoneNumber { 
    @GraphId Long id 
    String number 
} 

interface PhoneNumberRepository extends GraphRepository<PhoneNumber>, CypherDslRepository<PhoneNumber> { 
    /* Empty */ 
} 

interface PersonRepository extends GraphRepository<Person>, CypherDslRepository<Person> { 
    Person findByName(String name) 
} 

然后我创建并保存一些实体:

def num01 = new PhoneNumber(number: "0101") 
phoneNumberRepository.save(num01) 
def num02 = new PhoneNumber(number: "0202") 
phoneNumberRepository.save(num02) 

def alice = new Person(
    name: "Alice", 
    numbers: new LinkedHashSet<NumberRel>() 
) 
alice.numbers << new NumberRel(
    person: alice, 
    sequence: 10, 
    number: num01 
) 
alice.numbers << new NumberRel(
    person: alice, 
    sequence: 20, 
    number: num02 
); 
personRepository.save(alice) 

而这正是我坚持:我想告诉Spring或Neo4j加载由sequence属性的值排序的NumberRel关系。我找不到这样做的方法。

现在,订单是随机的。下面的代码prooves它:

(1..3).each { 
    println "Looking for Alice, pass ${it}" 
    def p = personRepository.findByName("Alice") 
    p.numbers.each { number -> 
     print "${number.sequence} " 
    } 
    println() 
} 

产生这样的输出:

Looking for Alice, pass 1 
10 20 
Looking for Alice, pass 2 
20 10 
Looking for Alice, pass 3 
10 20 

所以我的问题是:是否有已Person.numbers由NumberRel.sequence订购的方式?

回答

0

如果SDN不能对结果进行排序,发送收集到一种第一 -

(1..3).each { 
    println "Looking for Alice, pass ${it}" 
    def p = personRepository.findByName("Alice") 
    p.numbers.sort{it.sequence} 
    p.numbers.each { number -> 
     print "${number.sequence} " 
    } 
    println() 
}