使用SELECT NEW CONSTRUCTOR,参数不是表

时间:2014-01-15 17:43:07

标签: java hql

我现在在我的HQL中使用这样的东西:

"SELECT NEW com.somepackage.dto.SomeClass(myObj) "

但是现在我想在构造函数中添加 boolean 参数。 我已经使用HQL将其添加到我的DAO方法中,并将其添加到我的dto对象的构造函数中:

"SELECT NEW com.somepackage.dto.SomeClass(myObj, :param) "
...
.setParameter("param", param)

添加参数后,我得到了一个例外:

Unable to locate appropriate constructor on class

有没有办法将param添加到构造函数中?或者我犯了错误? 谢谢你的回复,对不起我的英文。

更新 (我的SomeClass的简单副本)

public class SomeClass extends SomeClassParent {

private final String someParam;
private final List<MyObject> myObjects;

public SomeClass(MyObject myObject) {
    super(myObject.getFirstField,
          myObject.getSecondField, ...);
    this.someParam = myObject.getSomeParamValue();
    StringBuilder bodyBuilder = new StringBuilder();
    ...

我希望它是

public SomeClass(MyObject myObject, boolean myBoolean) {

4 个答案:

答案 0 :(得分:0)

好吧,我不清楚的是,如果你有SomeClass定义,你可以定义任意数量的构造函数,只要它们有不同的类型或传递的参数数量。

它可以被视为一种覆盖(尽管它不是!)

由你来定义它,并用布尔做任何你想做的事情,实际上你可以复制并粘贴原始构造函数(只需将其保留在那里,不要删除它),并添加布尔值与前一个一样有效。

答案 1 :(得分:0)

我不知道boolean的确切问题是什么,但现在我使用String参数来对抗boolean并使用它:

"SELECT NEW com.somepackage.dto.SomeClass(myObj, '" + param + "') "...

setParameter不想使用String,因为它需要引号为结果字符串,如下所示:

"SELECT NEW com.somepackage.dto.SomeClass(myObj, 'Some string') "...

针对

"SELECT NEW com.somepackage.dto.SomeClass(myObj, Some string) "...

答案 2 :(得分:0)

我很确定您的问题出在boolean字段。我使用Hibernate HQL,我遇到了类似的问题。最后我意识到我必须为每个字段使用可空文件。

所以,我认为可以解决这个问题,将boolean原始字段转换为Boolean对象类。

答案 3 :(得分:0)

我在使用查询参数作为构造函数参数构建结果实体时遇到了类似的问题 - 比如"select new com.example.ResultType(t.id, ?1) from Table t where ..."。在查找构造函数时,似乎忽略了这样的简单查询参数 - 在该示例中,它将寻找一个构造函数,该构造函数采用与t.id匹配的单个参数。

到目前为止,我发现的唯一解决方法是使用强制转换(或其他一些非平凡的表达式)来包装参数,例如: "select new com.example.ResultType(t.id, cast(?1 as string)) ..."