возвращение списка экземпляров по внешнему ключу - PullRequest
0 голосов
/ 25 марта 2019

У меня есть две модели, Владелец и Контракт. Контракт имеет экземпляр владельца, у владельца нет списка контрактов. Я пытаюсь запросить мой список договоров, чтобы вернуть список, отфильтрованный по владельцу, то есть список договоров по владельцу.

Я пытался следовать предыдущим примерам и использовать критерии для написания настраиваемого запроса, но, следуя предложениям, я проверил доки и попытался использовать именованные запросы, однако, я все еще действительно изо всех сил.

There was an unexpected error (type=Internal Server Error, status=500).
Named parameter not bound : ownerId; nested exception is org.hibernate.QueryException: Named parameter not bound : ownerId

Мои модели выглядят так:


@Entity
@Table(name="Contracts")
@NamedQueries({
        @NamedQuery(
                name = "Contract.allContractsByOwner",
                query = "SELECT c FROM Contract c WHERE c.owner.id LIKE :ownerId"
        )
})

public class Contract {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column
    private Long id;

    @ManyToOne
    private Owner owner;

    @Column
    private double price;

    @Column
    private String deliverDate;

public Contract(Owner owner, double price, String deliverDate) {
        this.id = id;
        this.owner = owner;
        this.price = price;
        this.deliverDate = deliverDate;
    }

и


@Entity
@Table(name="Owners")
public class Owner {
  @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column
    private Long id;

    @Column
    private String name;

    public Owner(String name){
        this.name = name;
    }

мой контрактRepoImpl


@Service
    public class ContractRepositoryImpl implements ContractRepositoryCustom {


        ContractRepository contractRepository;

        @Autowired
        EntityManager entityManager;

        public List allContractsByOwner(Long ownerId) {
            List contracts = entityManager.createQuery(
                    "SELECT c FROM Contract c WHERE c.owner.id LIKE :ownerId", Contract.class)
                    .getResultList();
            return contracts;
        }
    }

, который я называю в моих файлах ContractRepo и ContractRepoCustom, а затем в своем контроллере я сопоставляю его так. Но когда я запрашиваю его в своем браузере, я получаю сообщение об ошибке в моем терминале.

  @GetMapping(value="/owners/{ownerId}/contracts")
    public List allContractsByOwner(@PathVariable("ownerId") Long ownerId){
        return contractRepository.allContractsByOwner(ownerId);
    }

Я понимаю, что это, вероятно, ошибки новичков, я пытаюсь следовать документам, но немного застрял в синтаксисе и там, где нужно добавлять аннотации.

1 Ответ

0 голосов
/ 25 марта 2019

Спасибо JB Низет, попал туда в конце

Я добавил параметры в свой контракт RepoImpl

  @Service
    public class ContractRepositoryImpl implements ContractRepositoryCustom {


        ContractRepository contractRepository;

        @Autowired
        EntityManager entityManager;


        public List allContractsByOwner(Long id) {
            List contracts = entityManager.createQuery(
                    "SELECT c FROM Contract c WHERE c.owner.id = :ownerId", Contract.class)
                    .setParameter("ownerId", id)
                    .getResultList();
            return contracts;
        }
    }

, что привело к ошибке SQL, которую я исправил, изменив мой @NamedQuery с 'LIKE' на '=' в моем классе Contract ...


@NamedQueries({
        @NamedQuery(
                name = "Contract.allContractsByOwner",
                query = "SELECT c FROM Contract c WHERE c.owner.id = :ownerId"
        )
})
...