【问题标题】:SpringData JPA - No Dialect mapping for JDBC type: 2003Spring Data JPA - JDBC 类型没有方言映射:2003
【发布时间】:2021-09-21 14:11:51
【问题描述】:

出现以下错误

没有 JDBC 类型的方言映射:2003;嵌套异常是 org.hibernate.MappingException: No Dialect mapping for JDBC type: 2

回购代码如下

    String chrPackageId = "select\n" +
         "\tcombination_hr_id as \"chRuleId\",\n" +
         "\tcombination_hr_name as \"chRuleName\", \n" +
        "\tholdingrule_list as \"selectedRules\"\n" +
         "from\n" +
         "\tcombination_holding_rule chr\n" +
         "where\n" +
         "\tpackage_id =:packageId";

@Query(value=chrPackageId,nativeQuery = true)
List<CHRfromPackageIdDTO> repoCHRFromPackageId(int packageId);

DTO 对象如下

public interface CHRfromPackageIdDTO {

    int getChRuleId();
    String getChRuleName();
    Integer[] getSelectedRules();
}

我们使用 Postgres DB,实际上在获取 Integer[] 值时存在一些问题。

Stackoverflow 中的其他答案是特定于 Hibernate 的。但我们使用spring-data-jpa

【问题讨论】:

标签: spring-boot spring-data-jpa


【解决方案1】:

实体类



import com.vladmihalcea.hibernate.type.array.IntArrayType;
import com.vladmihalcea.hibernate.type.array.StringArrayType;
import com.vladmihalcea.hibernate.type.json.JsonBinaryType;
import com.vladmihalcea.hibernate.type.json.JsonStringType;
import lombok.*;
import org.hibernate.annotations.Type;
import org.hibernate.annotations.TypeDef;
import org.hibernate.annotations.TypeDefs;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@TypeDefs({
        @TypeDef(
                name = "string-array",
                typeClass = StringArrayType.class
        ),
        @TypeDef(
                name = "int-array",
                typeClass = IntArrayType.class
        ),
        @TypeDef(name = "json", typeClass = JsonStringType.class),
        @TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
})
@Entity
@Table(name="combination_holding_rule")
public class CombHoldingRule {

    @Id
    @Column(name="combination_hr_id")//Checked
    private Integer combHoldingRuleId;
    @Column(name="combination_hr_name")//Checked
    private String combHoldingRuleName;
    @Column(name="jurisdiction_id")//Checked
    private Integer  jurisdictionId;
    @Column(name="function_group_id")//Checked
    private Integer  functionGroupId;
    @Column(name="overall_netting_type")//Checked
    private String overallNettingType;
    @Column(name="package_id")//Checked
    private Integer  packageId;

    @Type(type = "int-array")
    @Column(
            name = "holdingrule_list",
            columnDefinition = "integer[]"
    )
    private int[] holdingRuleList;

}

在存储库中

@Query(value="from CombHoldingRule where packageId=:packageId")
    List<CombHoldingRule> repoCHRFromPackageId(@Param("packageId") int packageId);

我将 JPAQuery 的结果放入 Entity 中,然后在服务层中执行以下操作

public List<CHRfromPackageIdDTO> getCHRFromPackageIdService(int packageId) {
       
        List<CombHoldingRule> combHoldingRuleList = combinationHRrepo.
                                           repoCHRFromPackageId(packageId);
        List<CHRfromPackageIdDTO> combDTO = new ArrayList<>();
        for ( CombHoldingRule combHoldingRule : combHoldingRuleList) {            
            CHRfromPackageIdDTO temp = new CHRfromPackageIdDTO(combHoldingRule.getCombHoldingRuleId(),
                    combHoldingRule.getCombHoldingRuleName(),
                    combHoldingRule.getHoldingRuleList());
            combDTO.add(temp);
        }       
        return combDTO;
    }

也请检查HERE

注意:这是一种解决方法,我相信,真的不确定,如何直接从本地查询中获取值到自定义 Pojo 而不是实体类。如果有人为此发布答案,我将不胜感激。我会接受这个作为答案。

【讨论】:

    猜你喜欢
    • 2017-12-16
    • 2014-03-05
    • 1970-01-01
    • 2015-01-18
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 2014-08-08
    相关资源
    最近更新 更多