QueryDSL 枚举将数据类型 varchar 转换为 float 时出错
QueryDSL Enum Error converting data type varchar to float
我在 SQL 2008 年执行使用 QueryDSL 构建的查询时遇到问题。
我的实体 bean 上有一个枚举字段:
@Column(name="APPROVAL_BY")
@Enumerated(EnumType.STRING)
private ApprovalTypeEnum approvedBy;
我正在使用它在 querydsl BooleanBuilder 中过滤我的结果集:
builder.and(qPositionToIndividualRelationship.approvedBy.stringValue().in(filter.getSelectedApprovalTypeList()));
然后在执行的 SQL 中产生以下子句:
str(positionto1_.APPROVAL_BY) in ('Value1' , 'Value2')
当 return 没有结果时这很好并且没有遇到错误,但是当有结果时我得到以下信息:
[SqlExceptionHelper.logExceptions] SQL Error: 8114, SQLState: S0005
[SqlExceptionHelper.logExceptions] Error converting data type varchar to float.
如果我在不使用 str() 进行解析的情况下手动执行查询,则查询工作正常并且 returns 我期望的结果。
有谁知道:
- 为什么 SqlServer 方言决定使用 str() 进行解析?
- 有什么办法可以避免这种情况吗?
干杯
所以,我对这里发生的事情的理解是调用 .stringValue() 是在查询中插入 STR(),而不是像您想要的那样获取枚举的字符串值。不确定是否有办法做到这一点,因为它正在处理 'Path' 类型的对象。
我认为 queryDSL 的真正目的是让您比较枚举与枚举,或对象与对象。然后它将处理转换,因此您无需担心。
即。
builder.and(qPositionToIndividualRelationship.approvedBy.in(filter.getSelectedApprovalTypeList()));
其中 filter.getSelectedApprovalTypeList()
returns 您的 ApprovalTypeEnum
列表
我在 SQL 2008 年执行使用 QueryDSL 构建的查询时遇到问题。
我的实体 bean 上有一个枚举字段:
@Column(name="APPROVAL_BY")
@Enumerated(EnumType.STRING)
private ApprovalTypeEnum approvedBy;
我正在使用它在 querydsl BooleanBuilder 中过滤我的结果集:
builder.and(qPositionToIndividualRelationship.approvedBy.stringValue().in(filter.getSelectedApprovalTypeList()));
然后在执行的 SQL 中产生以下子句:
str(positionto1_.APPROVAL_BY) in ('Value1' , 'Value2')
当 return 没有结果时这很好并且没有遇到错误,但是当有结果时我得到以下信息:
[SqlExceptionHelper.logExceptions] SQL Error: 8114, SQLState: S0005 [SqlExceptionHelper.logExceptions] Error converting data type varchar to float.
如果我在不使用 str() 进行解析的情况下手动执行查询,则查询工作正常并且 returns 我期望的结果。
有谁知道:
- 为什么 SqlServer 方言决定使用 str() 进行解析?
- 有什么办法可以避免这种情况吗?
干杯
所以,我对这里发生的事情的理解是调用 .stringValue() 是在查询中插入 STR(),而不是像您想要的那样获取枚举的字符串值。不确定是否有办法做到这一点,因为它正在处理 'Path' 类型的对象。
我认为 queryDSL 的真正目的是让您比较枚举与枚举,或对象与对象。然后它将处理转换,因此您无需担心。
即。
builder.and(qPositionToIndividualRelationship.approvedBy.in(filter.getSelectedApprovalTypeList()));
其中 filter.getSelectedApprovalTypeList()
returns 您的 ApprovalTypeEnum