Имаме проект с клас, наречен Location, и успешно внедрихме jparepositories, дефинирайки няколко метода за търсене. Бихме искали да имаме допълнителен метод за търсене, който да връща набор от имена на улици (извлечени от таблицата с местоположения), а не набор от местоположения - така че можем да приложим автоматично довършване, когато потребителят въвежда улици. Първо опитахме анотацията @Query:
@RepositoryRestResource(collectionResourceRel = "locations", path = "locations")
public interface LocationRepository extends JpaRepository<Location, Integer>, LocationRepositoryCustom {
List<Location> findByStreetNameStartingWithIgnoreCase(@Param("street") String streetName);
@Modifying
@Query("select x.streetName from Location x where x.streetName like :street%")
List<String> findStreetNameStartingWith(@Param("street") String streetName);
}
Ако попитам програмата за улица, която не съществува (няма улици, започващи с X, например), получих празен набор {} върнат. Ако потърся улица, която наистина съществува (street=Br, тъй като Бродуей съществува в базата данни), получавам
{"cause":null,"message":"PersistentEntity must not be null!"}
След това се опитахме да го приложим като персонализирана заявка, използвайки:
public interface LocationRepositoryCustom {
@Query("select x.streetName from Location x where x.streetName like :streetName")
public List<String> collectStreetNames(@Param("streetName") String streetName);
}
class LocationRepositoryImpl implements LocationRepositoryCustom {
@PersistenceContext
private EntityManager em;
@Override
public List<String> collectStreetNames(String streetName) {
List<String> retList = new ArrayList<String>();
retList.add("start");
retList.add("end");
return retList;
}
}
Това също ни дава грешката „PersistentEntity не трябва да е нула“. Кодът в изпълнението беше използван за връщане на резултат от твърд код, така че не се опитвахме да разберем дали нашият SQL е грешен или нашата архитектура. Пуснахме го при отстраняване на грешки и проверихме, че наистина списъкът с два елемента е върнат.
Изглежда, че проблемът връща нещо различно от списък от хранилището. Това ограничение ли е за тази архитектура? или има нещо, което правим грешно и че ако научим тайното ръкостискане, всичко ще бъде ужасно?