найти все ограничения, используя внешний ключ - PullRequest
0 голосов
/ 19 октября 2019

У меня есть две сущности, а именно:

Состояние

@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

Пожалуйста, помогите мне с этим ...

1 Ответ

2 голосов
/ 19 октября 2019

Проблема в том, что вы пропустили переменную id внутри вашего InsurerEntity класса.

Измените эту строку:

criteriaQuery = criteriaQuery.select(root).where(criteriaBuilder.equal(root.get("insurer"), id));

К этому:

criteriaQuery = criteriaQuery.select(root).where(criteriaBuilder.equal(root.get("insurer").get("id"), id)); 
...