2012-04-18 49 views
3

情况:我有一个对象SubjectRow一个包装对象主题(主客是持久化的实体)。我需要直接在HQL中创建新的包装器对象。如何通过布尔参数HQL新的构造

public class SubjectRow{ 
    Subject subject; 
    String myString; 
    boolean myBoolean; 

    public SubjectRow(SubjectSch subject, String myString) { 
     this.subject = subject; 
     this.myString = myString; 
    } 

    public SubjectRow(SubjectSch subject, boolean myBoolean) { 
     this.subject = subject; 
     this.myBoolean = myBoolean; 
    } 


} 

HQL用于字符串的构造函数(和它的作品像它应该):

SELECT new package.SubjectRow(s, 'myString') FROM Subject s 

问题。有时我需要调用另一个接受布尔值而不是字符串的包装的构造函数的问题。我尝试了相同的方法

SELECT new package.SubjectRow(s, true) FROM Subject s 

但是Hibernate抱怨说它无法在类SubjectRow中找到合适的构造函数。当然,我可以传递字符串,然后进行适当的投射 - 但它太难看了。

问题:我应该如何更改我的HQL和/或构造函数以直接传递此布尔参数(可以使用布尔值代替)?

“解决方案”。因为我无法找到如何正确传递布尔值,所以我必须稍微修改一下域对象。我只是从SubjectRow中移除了这个布尔属性,而是创建了原始对象的子对象的SubjectRowFalse和SubjectRowTrue类。现在只用两个HQL

SELECT FROM主体s

新package.SubjectRowTrue(S)选择新package.SubjectRowFalse(S)FROM主题航向

中,它仅仅是一个解决办法,而不是解决方案为原始问题

+0

我没有答案,但您不需要*从HQL查询中调用此构造函数。你只需要3行Java代码来明确地调用构造函数,并且有可重构的代码作为额外的奖励。 – 2012-04-18 17:19:13

+0

其实我需要。我必须通过HQL字符串,并且此包装必须在此字符串中构建 – dim1902 2012-04-18 17:29:38

+0

您是否找到解决方案? – lior 2014-11-05 09:15:19

回答

0

我不是100%确定,但我认为你可能需要使用布尔对象而不是布尔原语。

+0

试过那个。没有结果。类中的属性就像布尔myBoolean,它具有适当的getter和setter以及构造函数中的用法。在HQL中它看起来像“SubjectRow(s,java.lang.Boolean.TRUE)”。但是我得到相同的异常 - 构造函数是未定义的。 – dim1902 2012-04-23 07:41:40