Boa tarde a todos , estou com um estranho problema no metodo addOrder na api Criteria o oracle fica lançando ORA-02393: exceeded call limit on CPU usage estou usando o hibernate 4.1.4 e Oracle 11g express edition , abaixo segue os mapeamentos
public class Atendido {
@Id
@GeneratedValue
@Column(name = "ID")
private Long id;
@OneToOne(fetch = FetchType.LAZY, cascade = { javax.persistence.CascadeType.ALL })
@JoinColumn(name = "ID_PESSOA_FISICA")
private PessoaFisica pessoaFisica;
@OneToOne(fetch = FetchType.LAZY, cascade = { javax.persistence.CascadeType.ALL })
@JoinColumn(name = "ID_PESSOA_JURIDICA")
private PessoaJuridica pessoaJuridica;
@OneToMany(fetch = FetchType.LAZY, cascade = { javax.persistence.CascadeType.ALL }, orphanRemoval = true)
@BatchSize(size = 50)
@JoinColumn(name = "ID_ATENDIDO")
private List<RgCriminal> rgs;
.
.
//getters and setters
}
public class PessoaFisica {
@Id
@GeneratedValue
@Column(name = "ID")
private Long id;
@Column(name = "NOME_PAI")
private String nomePai;
@Column(name = "NOME_NASCIMENTO")
private String nomeNascimento;
@Column(name = "NOME_MAE")
private String nomeMae;
@Column(name = "NOME_SOCIAL")
private String nomeSocial;
.
.
//getters and setters
}
public class PessoaJuridica {
@Id
@GeneratedValue
@Column(name = "ID")
private Long id;
@Column(name = "RAZAO_SOCIAL")
private String razaoSocial;
@Column(name = "NOME_FANTASIA")
private String nomeFantasia;
@Column(name = "REPRESENTANTE_LEGAL")
private String representanteLegal;
.
.
//getters and setters
}
public class RgCriminal {
@Id
@GeneratedValue
@Column(name = "ID")
private Long id;
@Column(name = "RG_CRIMINAL")
private String rgCriminal;
.
.
//getters and setters
}
e tenho o seguinte metodo que faz a busca :
@SuppressWarnings("unchecked")
private List<Atendido> listAll(String term, Integer firstResult,
Integer maxResults) throws ParseException {
Criteria criteria = this.session.createCriteria(Atendido.class);
criteria.createCriteria("pessoaFisica", "pessoaFisica",
JoinType.LEFT_OUTER_JOIN);
criteria.createCriteria("pessoaJuridica", "pessoaJuridica",
JoinType.LEFT_OUTER_JOIN);
criteria.createCriteria("rgs", "rg", JoinType.LEFT_OUTER_JOIN);
Disjunction or = Restrictions.disjunction();
for (String token : term.split(";")) {
token = token.trim();
if (!StringUtils.isEmpty(token)) {
//my.Restrictions é um criterion que fiz pra procurar ignorando acentos a classe tambem segue mais abaixo
or.add(my.Restrictions
.ilike("pessoaFisica.nomeNascimento", token,
MatchMode.ANYWHERE));
or.add(my.Restrictions
.ilike("pessoaFisica.nomeSocial", token,
MatchMode.ANYWHERE));
or.add(my.Restrictions
.ilike("pessoaJuridica.nomeFantasia", token,
MatchMode.ANYWHERE));
or.add(my.Restrictions
.ilike("pessoaJuridica.razaoSocial", token,
MatchMode.ANYWHERE));
or.add(my.Restrictions
.ilike("pessoaJuridica.representanteLegal",
token, MatchMode.ANYWHERE));
or.add(my.Restrictions
.ilike("pessoaFisica.nomeMae", token,
MatchMode.ANYWHERE));
}
}
criteria.add(or);
if (firstResult != null && maxResults != null) {
criteria.setFirstResult(firstResult).setMaxResults(maxResults);
} else if (maxResults == null) {
criteria.setMaxResults(50);
} else {
criteria.setMaxResults(maxResults);
}
/* se eu comento esse bloco a query executa em 2 segundos , se eu descomento esse bloco oracle retorna ORA-02393: exceeded call limit on CPU pois a execução salta pra mais de 20 segundos . Sera algum tipo de bug ?
criteria.addOrder(Order.asc("pessoaFisica.nomeMae"));
criteria.addOrder(Order.asc("pessoaFisica.nomeNascimento"));
criteria.addOrder(Order.asc("pessoaJuridica.razaoSocial"));
*/
return criteria.list();
}
package br.gov.sp.defensoria.common.hibernate.criterion;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.criterion.CriteriaQuery;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.MatchMode;
import org.hibernate.dialect.Dialect;
import org.hibernate.engine.spi.TypedValue;
import br.gov.sp.defensoria.common.util.StringUtil;
public class LikeExpression implements Criterion {
private static final long serialVersionUID = 1L;
private final String propertyName;
private final Object value;
private final Character escapeChar;
private final boolean ignoreCase;
public LikeExpression(String propertyName, String value,
Character escapeChar, boolean ignoreCase) {
this.propertyName = propertyName;
this.value = value;
this.escapeChar = escapeChar;
this.ignoreCase = ignoreCase;
}
protected LikeExpression(String propertyName, String value) {
this(propertyName, value, null, false);
}
protected LikeExpression(String propertyName, String value,
MatchMode matchMode) {
this(propertyName, matchMode.toMatchString(value));
}
protected LikeExpression(String propertyName, String value,
MatchMode matchMode, Character escapeChar, boolean ignoreCase) {
this(propertyName, matchMode.toMatchString(value), escapeChar,
ignoreCase);
}
public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery)
throws HibernateException {
String searchFor = "áàâãªéèêóòôõºúùûçÁÀÂÃÉÈÊÓÒÔÕÚÙÛÇ";
String replaceTo = "aaaaaeeeooooouuucaaaaeeeoooouuuc";
Dialect dialect = criteriaQuery.getFactory().getDialect();
String[] columns = criteriaQuery.findColumns(propertyName, criteria);
if (columns.length != 1) {
throw new HibernateException(
"Like may only be used with single-column properties");
}
String escape = escapeChar == null ? "" : " escape \'" + escapeChar
+ "\'";
String column = columns[0];
if (ignoreCase) {
if (dialect.supportsCaseInsensitiveLike()) {
return "translate(" + column + ",'" + searchFor + "','"
+ replaceTo + "')" + dialect.getCaseInsensitiveLike() + " ?"
+ escape;
} else {
return dialect.getLowercaseFunction() + '(' + "translate(" + column + ",'" + searchFor + "','"
+ replaceTo + "')" + ')'
+ " like ?" + escape;
}
} else {
return "translate(" + column + ",'" + searchFor + "','"
+ replaceTo + "') like ?" + escape;
}
}
public TypedValue[] getTypedValues(Criteria criteria,
CriteriaQuery criteriaQuery) throws HibernateException {
return new TypedValue[] { criteriaQuery.getTypedValue(
criteria,
propertyName,
ignoreCase ? StringUtil.removeAccentuation(value.toString()
.toLowerCase()) : StringUtil.removeAccentuation(value
.toString())) };
}
}
package br.gov.sp.defensoria.common.hibernate.criterion;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.MatchMode;
public class Restrictions {
public static Criterion ilike(String propertyName, String value,MatchMode matchMode) {
return new LikeExpression(propertyName, value, matchMode, null, true);
}
}
Minha tabela onde a busca é ralizada contém mais de 400.000 registros e só tende a crescer . Alguem ja sofreu esse tipo de problema ? Ou tem alguma luz do que seja ?