Skip to content

SQM Resolving DATE() SQL function as Object instead of Date  #3694

@dragoamplio

Description

@dragoamplio

Getting this start-up error:

Caused by: org.hibernate.query.SemanticException: Missing constructor for type 'ContractStatisticsDto' [SELECT new com.amplio.amplio.contract.dto.ContractStatisticsDto(DATE(c.createdAt), c.status, COUNT(c)) FROM contract c WHERE c.createdAt >= :startDate GROUP BY DATE(c.createdAt), c.status ORDER BY DATE(c.createdAt), c.status]
	at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitInstantiation(SemanticQueryBuilder.java:1506)
	at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitInstantiation(SemanticQueryBuilder.java:275)
	at org.hibernate.grammars.hql.HqlParser$InstantiationContext.accept(HqlParser.java:4029)
	at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitSelectableNode(SemanticQueryBuilder.java:1453)
	at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitSelection(SemanticQueryBuilder.java:1407)
	at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitSelectClause(SemanticQueryBuilder.java:1400)
	at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitQuery(SemanticQueryBuilder.java:1249)
	at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitQuerySpecExpression(SemanticQueryBuilder.java:1035)
	at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitQuerySpecExpression(SemanticQueryBuilder.java:275)
	at org.hibernate.grammars.hql.HqlParser$QuerySpecExpressionContext.accept(HqlParser.java:2132)
	at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitSimpleQueryGroup(SemanticQueryBuilder.java:1020)
	at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitSimpleQueryGroup(SemanticQueryBuilder.java:275)
	at org.hibernate.grammars.hql.HqlParser$SimpleQueryGroupContext.accept(HqlParser.java:2003)
	at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitSelectStatement(SemanticQueryBuilder.java:490)
	at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitStatement(SemanticQueryBuilder.java:449)
	at org.hibernate.query.hql.internal.SemanticQueryBuilder.buildSemanticModel(SemanticQueryBuilder.java:322)
	at org.hibernate.query.hql.internal.StandardHqlTranslator.translate(StandardHqlTranslator.java:71)
	at org.hibernate.query.internal.QueryInterpretationCacheStandardImpl.createHqlInterpretation(QueryInterpretationCacheStandardImpl.java:145)
	at org.hibernate.query.internal.QueryInterpretationCacheStandardImpl.resolveHqlInterpretation(QueryInterpretationCacheStandardImpl.java:132)
	at org.hibernate.internal.AbstractSharedSessionContract.interpretHql(AbstractSharedSessionContract.java:802)
	at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:852)

Query:

@Query("SELECT new com.amplio.amplio.contract.dto.ContractStatisticsDto(" +
            "DATE(c.createdAt), c.status, COUNT(c)) " +
            "FROM contract c " +
            "WHERE c.createdAt >= :startDate " +
            "GROUP BY DATE(c.createdAt), c.status " +
            "ORDER BY DATE(c.createdAt), c.status")
    List<ContractStatisticsDto> findContractStatisticsByDateRange(LocalDateTime startDate);

Class:

public class ContractStatisticsDto {
    private Date day;
    private ContractStatus status;
    private Long count;

    public ContractStatisticsDto(Date day, ContractStatus status, Long count) {
        this.day = day;
        this.status = status;
        this.count = count;
    }
}

SQM is inferring that DATE(c.createdAt) is of type Object instead of java.util.Date on startup and its failing to start. Even though it's actually of type java.util.Date once the app starts and it gets query results. Workaround:

public class ContractStatisticsDto {
    private Date day;
    private ContractStatus status;
    private Long count;

    public ContractStatisticsDto(Object day, ContractStatus status, Long count) {
        this.day = (Date) day;
        this.status = status;
        this.count = count;
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    for: external-projectFor an external project and not something we can fix

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions