2016-11-09 21 views
0

CriteriaBuilderで結合を使用して選択をしようとしていますが、Eclipseでこのエラーが発生しています。どうすれば修正できますか?
Java CriteriaBuilder結合 - 解決できないか、フィールドではありません

Hibernate version: hibernate-jpa-2.0-api<br /> 

Java Version: 1.8 

fonte cannot be solved or is not a field 

NotificacaoDao.java

@Stateless 
public class NotificacaoDao { 
    @PersistenceContext(unitName = "PostgreSQLDS") 
    private EntityManager em; 

    @EJB 
    private NotificacaoDao NotificacaoDao; 

    public List<Notificacao> getResultList(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) throws ApplicationException{ 
     try { 

      CriteriaBuilder cb = em.getCriteriaBuilder(); 
      CriteriaQuery<Notificacao> cq = cb.createQuery(Notificacao.class); 

      Metamodel m = em.getMetamodel(); 
      EntityType<Notificacao> Notificacao_ = m.entity(Notificacao.class); 

      Root<Notificacao> myObj = cq.from(Notificacao_); 
      Join<Notificacao, Fonte> fontes = myObj.join(Notificacao_.fonte); // HERE I'M GETTING THE ERROR 
      cq.where(NotificacaoDao.getFilterCondition(cb, myObj, filters)); 
      Predicate filterCondition = NotificacaoDao.getFilterCondition(cb, myObj, filters); 
      filterCondition = cb.and(filterCondition, cb.equal(myObj.get("excluido"), "N")); 
      cq.where(filterCondition); 
      if (sortField != null) { 
       if (sortOrder == SortOrder.ASCENDING) { 
        cq.orderBy(cb.asc(myObj.get(sortField))); 
       } else if (sortOrder == SortOrder.DESCENDING) { 
        cq.orderBy(cb.desc(myObj.get(sortField))); 
       } 
      } 
      return em.createQuery(cq).setFirstResult(first).setMaxResults(pageSize).getResultList(); 
     } catch(Exception e) { 
      throw new ApplicationException("myException", e); 
     } 
    } 

@Entity 
@Table(name = "tb_notificacao", schema = "indicadores") 
@NamedQuery(name = "Notificacao.findAll", query = "SELECT n FROM Notificacao n") 
@FilterDef(name="notificacaoNaoExcluido", defaultCondition="excluido = 'N'") 
public class Notificacao implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @SequenceGenerator(name = "tb_notificacao_codnotificacao_seq", sequenceName = "TB_NOTIFICACAO_CODNOTIFICACAO_SEQ", schema = "indicadores", allocationSize = 1) 
    @GeneratedValue(generator = "tb_notificacao_codnotificacao_seq") 
    @Column(name = "codnotificacao", nullable = false) 
    private Integer codnotificacao; 

    private String descricao; 

    private String excluido; 

    private String nome; 

    // bi-directional many-to-one association to CargaNotificacao 
    @OneToMany(mappedBy = "notificacao") 
    private List<CargaNotificacao> cargaNotificacoes; 

    // bi-directional many-to-one association to Fonte 
    @Inject 
    @ManyToOne 
    @JoinColumn(name = "codfonte") 
    private Fonte fonte; 

    // bi-directional many-to-one association to UsuarioNotificacao 
    @OneToMany(mappedBy = "notificacao") 
    @Filter(name="usuarioNaoExcluido", condition="excluido = 'N'") 
    private List<UsuarioNotificacao> usuarioNotificacoes; 

    public Notificacao() { 
    } 
    // getters and setters 
} 

Notificacao.java Fonte.java

@Entity 
@Table(name = "tb_fonte", schema = "indicadores") 
@NamedQuery(name = "Fonte.findAll", query = "SELECT f FROM Fonte f") 
public class Fonte implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @SequenceGenerator(name = "tb_fonte_codfonte_seq", sequenceName = "TB_FONTE_CODFONTE_SEQ", schema = "indicadores", allocationSize = 1) 
    @GeneratedValue(generator = "tb_fonte_codfonte_seq") 
    @Column(name = "codfonte", nullable = false) 
    private Integer codfonte; 

    private String nome; 

    // bi-directional many-to-one association to Indicador 
    @OneToMany(mappedBy = "fonte") 
    @Filter(name="indicadorNaoExcluido", condition="excluido = 'N'") 
    private List<Indicador> indicadores; 

    // bi-directional many-to-one association to Notificacao 
    @OneToMany(mappedBy = "fonte") 
    @Filter(name="notificacaoNaoExcluido", condition="excluido = 'N'") 
    private List<Notificacao> notificacoes; 

    public Fonte() { 
    } 
    // getters and setters 
} 

答えて

2

さて、上のメタモデル

  1. IDEベースのメタモデル生成ツール
  2. を使用して静的Canonicalのメタモデルクラス
  3. を使用してem.getMetamodel()APIすなわちあなたがを使用しているものを使用:使用する3つのアプローチは基本的にあります。

あなたは何をしていたに近いある使用するために私が提案しています解決策がポイントである3

ポイント3ソリューション:

Metamodel m = em.getMetamodel(); 
    EntityType<Notificacao> Notificacao_ = m.entity(Notificacao.class); 
    Root<Notificacao> myObj = cq.from(Notificacao_); 
    Join<Notificacao, Fonte> fontes = myObj.join(Notificacao_.fonte); // HERE I'M GETTING THE ERROR 
以下のコードを置き換え新しいコードで

Metamodel m = em.getMetamodel(); 
    EntityType<Notificacao> notificacao_ = m.entity(Notificacao.class); 
    Root<Notificacao> myObj = cq.from(notificacao_); 
    Join<Notificacao, Fonte> fontes = myObj.join(notificacao_.getSingularAttribute("fonte",Fonte.class)); 

ポイント1 & 2解決策 Notificacao_は静的または生成されたクラスでなければならず、em.getMetamodel()のインスタンスであってはならないことに注意してください。また、示されているようNotificacao_ではなく、クラスの変数になる前に、あなたのケースで注意してください:あなたはより多くの情報が必要な場合は

EntityType<Notificacao> Notificacao_ = m.entity(Notificacao.class); 

、私にしてください教えてください。

+0

Eclipse Neonを使用しています –

+0

私があなたに提案している上記のソリューションを検討できるようになりました。 –

関連する問題