使用外键查找所有约束

问题描述 投票:0回答:1

我有两个实体,即:

状态

@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

}

保险人的ID在状态数据库中保存为'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

请帮助我...

java spring hibernate persistence hibernate-criteria
1个回答
0
投票

问题是您错过了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)); 
© www.soinside.com 2019 - 2024. All rights reserved.