На самом деле, я почти уверен, что в журналах сервера есть больше полезных следов.Но в любом случае у меня есть несколько замечаний:
Прежде всего, id
для Marca
не является атрибутом Modelos
, поэтому ваш запрос неверен, вам нужно либо передать экземпляр, либоMarcas
или для навигации по ассоциации, если вы передаете id
(вам нужно подумать об объекте и ассоциации при использовании JPA).
Во-вторых, то, как вы выполняете запрос, неверно, вам следуетпараметризовать его.
В-третьих, при использовании проекций SQL вы получите Object[]
(или List<Object[]>
, если имеется несколько результатов), а не строго типизированный результат, если вы не используете выражение конструктора SELECT NEW
.
Подводя итог, должно работать следующее:
public List<Object[]> findByMarcas(Marcas marcas){
Query q = em.createQuery("SELECT m.id, m.descripcion FROM Modelos m WHERE m.idMarca = :marcas");
q.setParameter("marcas", marcas);
return q.getResultList();
}
Или, если вы передаете идентификатор в качестве параметра запроса (но приведенный выше запрос вполне подходит):
public List<Object[]> findByMarcas(Marcas marcas){
Query q = em.createQuery("SELECT m.id, m.descripcion FROM Modelos m WHERE m.idMarca.id = :idMarca");
q.setParameter("idMarca", marcas.getId());
return q.getResultList();
}
Но я бы не использовал проекции или использовал выражение конструктора SELECT NEW:
public List<Modelos> findByMarcas(Marcas marcas){
Query q = em.createQuery("SELECT m FROM Modelos m WHERE m.idMarca.id = :idMarca");
q.setParameter("idMarca", marcas.getId());
return q.getResultList();
}
или (при условии, что Modelos
имеет соответствующий конструктор):
public List<Modelos> findByMarcas(Marcas marcas){
Query q = em.createQuery("SELECT NEW com.acme.Modelos(m.id, m.descripcion) FROM Modelos m WHERE m.idMarca.id = :idMarca");
q.setParameter("idMarca", marcas.getId());
return q.getResultList();
}
И вообще, я бы использовал именованный запрос, например:
@NamedQuery(
name="Modelos.findByMarcas",
query="SELECT m FROM Modelos m WHERE m.idMarca = :marcas"
)
и использовал бы:
public List<Modelos> findByMarcas(Marcas marcas){
Query q = em.createNamedQuery("Modelos.findByMarcas");
q.setParameter("marcas", marcas);
return q.getResultList();
}
Кстати, я бы переименовал idMarca
в marcas
наModelos
сущность, idMarca
вводит в заблуждение:
@ManyToOne(optional = false)
private Marcas marcas;