0

I'm trying to do a select using a join in CriteriaBuilder, but I'm getting this error in Eclipse. How can I fix it?

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);
        }
    }

Notificacao.java

@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
}

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
}
0

1 Answer 1

2

Well, on Metamodels there are basically three approaches to use:

  1. Using IDE based metamodel generation tools
  2. Using Static Canonical Metamodel Classes
  3. Using em.getMetamodel() API i.e. the one you are using.

The solution I am proposing for you to use which is closer to what you were doing is on Point 3.

Point 3 Solution : Replace the below code :

    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 

With new code :

    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));

Points 1 & 2 Solutions Please note the Notificacao_ must be a class either static or generated and must never be an instance of em.getMetamodel(). Also note in your case before Notificacao_ was a variable instead of a class as shown:

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

If you need more info, let me know please.

Sign up to request clarification or add additional context in comments.

2 Comments

I'm using Eclipse Neon
You can now consider the above solution I'm proposing for you.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.