Search code examples
hibernatejpacriteriatransient

Transient property causes org.hibernate.QueryException: could not resolve property: severidadeRecente of: br.com.timbrasil.bluemonster.modelo.Csr


I'm trying to use Criteria API to get a List<Csr> ordered by its transient severidadeRecente property.

The entity and the relationship i'm using:

@Entity
@Table(name = "csr")
public class Csr implements Serializable {
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "csr")
    private List<CsrSeveridadeLog> severidadeLogList;

    //Used to get and set the most recent Severidade
    @Transient
    private CsrSeveridadeLog severidadeRecente;

    public CsrSeveridadeLog getSeveridadeRecente() {
        Calendar compare = null;
        CsrSeveridadeLog recente = null;

        for (CsrSeveridadeLog log : severidadeLogList) {
            if (compare == null) {
                compare = log.getData();
                recente = log;
            }
            if (log.getData().after(compare)) {
                recente = log;
            }
        }
        return recente;
    }

I'm using the below criteria query:

Criteria criteria = session.createCriteria(Csr.class,"csr");
if ("severidadeRecente".equals(filtro.getPropriedadeOrdenacao())) {
    criteria.createAlias("csr.severidadeRecente", "severidadeRecente");
}

The filtro.getPropriedadeOrdenacao() is coming from the client.

But I get the following exception:

Caused by: org.hibernate.QueryException: could not resolve property: severidadeRecente of: br.com.timbrasil.bluemonster.modelo.Csr

How can I solve it? I need to order my table based on a List that my entity has, taking the most recent record on that list.


Solution

  • Do you have filed severidadeRecente in Csr class with proper getter and setter?

    UPDATE:

    As @ChssPly76 said:

    You can't use nested paths directly in Criteria API (unlike HQL). Instead, you need to create nested criteria instances or define aliases on each "entity.property" pair starting with the first non-root entity

    So try to do something like this:

    criteria.createAlias("csr", "c")
    .createAlias("c.severidadeRecente", "severidadeRecente")