//PersonRepository.java
package com.pockettheories;
import org.springframework.data.mongodb.repository.Aggregation;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface PersonRepository extends MongoRepository<Person, String> { //the 2nd generic is data type of ID
List<Person> findPersonsByFirstName(String firstName);
@Query("{'firstName': :#{#fname}}")
List<Person> findPersonByDisplayName(@Param("fname") String displayName);
@Query("{'firstName': ?0}")
List<Person> findPersonByDisplayName2(String displayName);
@Aggregation(pipeline = {
"{'$match': {'firstName': ?0}}",
"{'$sort': {'firstName': 1}}"
})
List<Person> findPersonByGoodName(String name);
}
//PersonService.java
package com.pockettheories;
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
@Service
public class PersonService {
@Autowired
public PersonRepository repository;
public List<Person> findPersonsByFirstName(String firstName) {
return repository.findPersonsByFirstName(firstName);
}
public List<Person> findPersonsByFirstName2(String firstName) {
return repository.findPersonByDisplayName(firstName);
}
public List<Person> findPersonsByFirstName3(String firstName) {
return repository.findPersonByGoodName(firstName);
}
public void insert(Person p) {
repository.insert(p);
}
public List<Person> getAll() {
return repository.findAll();
}
}
//PersonController.java
package com.pockettheories;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class PersonController {
@Autowired
protected PersonService service;
@GetMapping("/")
public String index() {
return "Hello World!";
}
@GetMapping("/name/{name}")
public String getByName(@PathVariable String name) {
List<Person> lstPerson = service.findPersonsByFirstName(name);
String retVal = "";
if (lstPerson.size()==0) {
retVal = "No results";
} else {
retVal = lstPerson.get(0).toString();
}
return retVal;
}
@GetMapping("/name2/{name}")
public String getByName2(@PathVariable String name) {
List<Person> lstPerson = service.findPersonsByFirstName2(name);
String retVal = "";
if (lstPerson.size()==0) {
retVal = "No results";
} else {
retVal = lstPerson.get(0).toString();
}
return retVal;
}
@GetMapping("/name3/{name}")
public String getByName3(@PathVariable String name) {
List<Person> lstPerson = service.findPersonsByFirstName3(name);
String retVal = "";
if (lstPerson.size()==0) {
retVal = "No results";
} else {
retVal = lstPerson.get(0).toString();
}
return retVal;
}
@GetMapping("/save/{name}")
public String saveName(@PathVariable String name) {
String firstName = name.split(" ")[0];
String lastName = name.split(" ")[1];
Person p = new Person();
p.id = String.format("%s %s", firstName, lastName);
p.firstName = firstName;
p.lastName = lastName;
service.insert(p);
return "OK";
}
public ResponseEntity getAll() {
return ResponseEntity.ok(service.getAll());
}
}
//Person.java
package com.pockettheories;
public class Person {
public String id;
public String firstName;
public String lastName;
public String toString() {
StringBuilder strBuild = new StringBuilder();
strBuild.append(String.format("id: %s\n", id));
strBuild.append(String.format("firstName: %s\n", firstName));
strBuild.append(String.format("lastName: %s\n", lastName));
return strBuild.toString();
}
}