Skip to content

DTO query rewriting renders invalid queries #3895

Closed
@dev-ducu

Description

@dev-ducu

I am seeing this error with spring-data 3.5.0:

INFO  [2025-05-19 17:36:30,602] [] [kafka-producer-network-thread | producer-2] org.apache.kafka.clients.producer.internals.TransactionManager: [Producer clientId=producer-2] ProducerId set to 1 with epoch 0
java.lang.IllegalArgumentException: org.hibernate.query.SyntaxException: At 1:50 and token ')', no viable alternative at input 'SELECT new com.adswizz.domain.entity.CampaignDeal(*) FROM CampaignDeal cd LEFT JOIN FETCH cd.dealLibrary d LEFT JOIN FETCH d.publisher p WHERE cd.campaignId = :campaignId' [SELECT new com.adswizz.domain.entity.CampaignDeal() FROM CampaignDeal cd LEFT JOIN FETCH cd.dealLibrary d LEFT JOIN FETCH d.publisher p WHERE cd.campaignId = :campaignId]

when running the following query:

@Query("SELECT cd FROM CampaignDeal cd "
            + "LEFT JOIN FETCH cd.dealLibrary d "
            + "LEFT JOIN FETCH d.publisher p "
            + "WHERE cd.campaignId = :campaignId")`
List<CampaignDeal> findCampaignDealsForCampaign(Integer campaignId);

The entity definition is:

@Entity
@Table(name = "campaign_deals")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CampaignDeal {

    @EmbeddedId
    private CampaignDealId campaignDealId;

    @Column(name = "campaign_id", insertable = false, updatable = false)
    private Integer campaignId;

    @Column(name = "deal_library_id")
    private Integer dealLibraryId;

    @ToString.Exclude
    @EqualsAndHashCode.Exclude
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "deal_library_id", updatable = false, insertable = false, referencedColumnName = "id")
    private Deal dealLibrary;

    @Column(name = "publisher_id")
    private Integer publisherId;

    @ToString.Exclude
    @EqualsAndHashCode.Exclude
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "publisher_id", updatable = false, referencedColumnName = "affiliateid", insertable = false)
    private Publisher publisher;

    @Column(name = "type")
    @Enumerated(EnumType.STRING)
    private Type type;

    @Embeddable
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    public static class CampaignDealId implements Serializable {

        private static final long serialVersionUID = 5373763488252554888L;

        @ManyToOne(fetch = FetchType.LAZY, targetEntity = Campaign.class)
        @JoinColumn(name = "campaign_id")
        @ToString.Exclude
        @EqualsAndHashCode.Exclude
        private Campaign campaign;

        @Column(name = "deal_id") //the dealID string, not the fk to deal_library
        private String dealId;

    }

    public enum Type {
        STRING,
        LIBRARY
    }
}

This used to work just fine until upgrading to the 3.5.0 version.

Metadata

Metadata

Assignees

Labels

type: regressionA regression from a previous release

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions