Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

438
Views
¿Cómo usar DATE_ADD de MySQL con criterios JPA?

Necesito agregar un intervalo a una fecha (ambas columnas están en una tabla) usando los criterios MySQL y JPA. Sé que se requieren las siguientes funciones:

DATE_ADD de MySQL:

 DATE_ADD(date,INTERVAL expr unit)

function de CriteriaBuilder:

 function(String name, Class<T> type, Expression<?>... args)

También tengo una clase para crear expresiones de función:

 public class SqlFunctionExpression extends BasicFunctionExpression<String> implements Serializable { public SqlFunctionExpression(CriteriaBuilderImpl criteriaBuilder, Class<String> javaType, String functionName) { super(criteriaBuilder, javaType, functionName); } @Override public String render(RenderingContext renderingContext) { return getFunctionName(); } }

que se puede usar como new SqlFunctionExpression(null, String.class, "MINUTE") para crear una unidad de minutos.

Sin embargo, ¿cómo creo la expresión INTERVAL expr unit donde expr es una columna de tabla?

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

o podemos agregar la fecha directamente desde el lado de Java y enviarlo como argumento para comparar, así

 criteriaBuilder.equal(exceptionsJoinOnRoot.get(MyModelClass_.tartDate), Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).plus(Period.ofDays(1)) .toInstant()))

si esto no funciona, podemos usar la función mysql ADDDATE

 criteriaBuilder.equal(exceptionsJoinOnRoot.get(MyModelClass_.tartDate), criteriaBuilder.function("ADDDATE",Date.class,criteraBuilder.currentTimestamp(),criteriaBuilder.literal(1)))
over 4 years ago · Santiago Trujillo Report

0

función de registro

 public class CommonMySQLDialect extends MySQL57Dialect { public CommonMySQLDialect() { super(); registerFunction("date_add", new SQLFunctionTemplate(TimestampType.INSTANCE, "date_add(?1, INTERVAL ?2 ?3)")); } }

Agregar a la configuración de hibernación

 <property name="hibernate.dialect">yourpackage.CommonMySQLDialect</property>

Listo para usar

 Expression<String> unit = new SqlFunctionExpression(null, String.class, "MINUTE"); Expression<Integer> num = cb.literal(10); Expression<Date> newDate = cb.function("date_add", Date.class, cb.currentTimestamp(), num, unit);
over 4 years ago · Santiago Trujillo Report

0

Para pasar tokens sin procesar como INTERVAL 1 YEAR a MySQL, puede usar mi clase OpaqueLiteralExpression que se describe aquí: https://stackoverflow.com/a/69998155/263801

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!