У меня есть две сущности, а именно:
Состояние
@Entity
@Table(name = "State")
public class StateEntity {
@Column(name = "id", length = 36, nullable = false, unique = true)
private String id;
@ManyToOne (fetch = FetchType.LAZY)
@JoinColumn(name = "InsurerId", nullable = false)
private InsurerEntity insurer;
@Column(name ="StateName", length = 50, nullable = false)
private String stateName;
//getters and setters
}
Страховщик
@Entity
@Table(name = "Insurer")
public class InsurerEntity {
@Column(name = "InsurerId", length = 36, nullable = false, unique = true)
private String insurerId;
@Column(name = "InsurerName", length = 100, nullable = true)
private String insurerName;
@OneToMany(mappedBy = "state", fetch = FetchType.LAZY)
private List<StateEntity> stateEntityList;
//getters and setters
}
идентификатор страховщика сохраняется в базе данных состояний как 'insurerid', и я хочучтобы получить его, используя запрос критерия гибернации, но я не могу понять это. Легко получить внешний ключ, используя statename, но когда я пытаюсь наоборот, ничего не получается
Я пытаюсь выполнить этот запрос: SELECT StateName FROM Mydb.state where InsurerId='74'
Я пытался это: 1
@PersistenceContext
private EntityManager entityManager;
@Override
@Transactional(readOnly = true)
public List<StateEntity> findByForeignId(String id) {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<StateEntity> criteriaQuery = criteriaBuilder.createQuery(StateEntity.class);
Root<StateEntity> root = criteriaQuery.from(StateEntity.class);
criteriaQuery = criteriaQuery.select(root).where(criteriaBuilder.equal(root.get("insurer"), id));
try {
return entityManager.createQuery(criteriaQuery).getResultList();
} catch (NoResultException nre) {
return null;
} catch (NonUniqueResultException nure) {
return null;
}
}
Но возвращается:
java.lang.IllegalArgumentException: Parameter value [74] did not match expected type [in.unlimitdigital.poleasy.entities.InsurerEntity (n/a)]
И: 2
@PersistenceContext
private EntityManager entityManager;
@Override
@Transactional(readOnly = true)
public List<ModelEntity> findByForeignId(String id) {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<ModelEntity> criteriaQuery = criteriaBuilder.createQuery(ModelEntity.class);
Root<BrandEntity> root = criteriaQuery.from(BrandEntity.class);
criteriaQuery = criteriaQuery.multiselect(root).where(criteriaBuilder.equal(root.get("id"), id));
try {
return entityManager.createQuery(criteriaQuery).getResultList();
} catch (NoResultException nre) {
return null;
} catch (NonUniqueResultException nure) {
return null;
}
}
Возвращается:
java.lang.ClassCastException: org.hibernate.hql.internal.ast.tree.SqlNode cannot be cast to org.hibernate.hql.internal.ast.tree.FromReferenceNode
Пожалуйста, помогите мне с этим ...