2015-11-05 149 views
0

我在与执行上的SQL使用QueryDSL建一个查询的问题2008年QueryDSL枚举错误转换数据类型为varchar浮动

我有我的实体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') 

当没有返回结果,这是好的,并没有遇到任何错误,但是当有结果我得到如下:

[SqlExceptionHelper.logExceptions] SQL Error: 8114, SQLState: S0005 [SqlExceptionHelper.logExceptions] Error converting data type varchar to float.

如果我手动执行的查询,而无需解析使用STR ()查询工作正常,并返回我期望的结果。

有谁知道:

  1. 为什么SQLServer的方言决定使用STR解析()?
  2. 有没有办法来防止这种情况?

干杯

+0

SQL中并没有对关于什么要求您使用'STR()'。这将是你的ORM做自己的事情,这种方式毫无意义。 STR()字符串 - 数字字段。它永远不会包含任何像'Value1'的东西。我猜你的问题是QueryDSL层中的某种类型或配置,它认为该字段是数字的,因此会话并试图在SQL中使用STR()。 –

+0

嗨安德鲁,感谢您的回应 - 是的,我不认为这是SQL本身做任何事情,它只能执行它给出的内容,我明白这个问题与ORM如何解释然后通过执行。这就是说,就像你说,它没有任何意义,为什么它使用STR()在明确定义的“字符串”类型的枚举字段.... – TCollins

回答

0

所以,我对什么发生在这里是调用.stringValue()在查询中插入STR(),没有得到像或许你正打算枚举的字符串值的理解。不确定是否有办法做到这一点,因为它正在处理一个'Path'类型的对象。

我认为queryDSL真的打算让你将枚举与枚举或对象与对象进行比较。它会处理转换,所以你不需要担心它。

即。 builder.and(qPositionToIndividualRelationship.approvedBy.in(filter.getSelectedApprovalTypeList()));

其中filter.getSelectedApprovalTypeList()回到你的ApprovalTypeEnum

相关问题