coldfusion Form:多对多条件属性

coldfusion Form:多对多条件属性,orm,coldfusion,many-to-many,where-clause,Orm,Coldfusion,Many To Many,Where Clause,我试图将where子句添加到我在一个对象中定义的多对多属性中。我一定是做错了什么,因为我不断收到hibernate错误,说该列不存在 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

我试图将where子句添加到我在一个对象中定义的多对多属性中。我一定是做错了什么,因为我不断收到hibernate错误,说该列不存在

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class entity-name="Tag" lazy="true"
        name="cfc:www.app.models.test.Tag" table="tag">
        <id name="id" type="string">
            <column length="255" name="id"/>
        </id>
        <property name="name" type="string">
            <column name="name"/>
        </property>
        <property name="deleted" type="string">
            <column default="0" name="deleted"/>
        </property>
        <bag name="articles" table="link_article_tag">
            <key column="tagId"/>
            <many-to-many class="cfc:www.app.models.test.Article" column="articleId"/>
        </bag>
    </class>
</hibernate-mapping>
在模板cfc中:

<cfproperty
    name="Settings"
    fieldtype="many-to-many"
    cfc="Setting"
    linktable="settings_templates"
    fkcolumn="templateID"
    inversejoincolumn="settingsId"
    where="deleted='false'"
>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class entity-name="Tag" lazy="true"
        name="cfc:www.app.models.test.Tag" table="tag">
        <id name="id" type="string">
            <column length="255" name="id"/>
        </id>
        <property name="name" type="string">
            <column name="name"/>
        </property>
        <property name="deleted" type="string">
            <column default="0" name="deleted"/>
        </property>
        <bag name="articles" table="link_article_tag">
            <key column="tagId"/>
            <many-to-many class="cfc:www.app.models.test.Article" column="articleId"/>
        </bag>
    </class>
</hibernate-mapping>

在设置cfc中:

<cfproperty
    name="templates"
    fieldtype="many-to-many"
    cfc="Template"
    linktable="settings_templates"
    fkcolumn="settingsId"
    inversejoincolumn="templateID"
    where="deleted='false'"
>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class entity-name="Tag" lazy="true"
        name="cfc:www.app.models.test.Tag" table="tag">
        <id name="id" type="string">
            <column length="255" name="id"/>
        </id>
        <property name="name" type="string">
            <column name="name"/>
        </property>
        <property name="deleted" type="string">
            <column default="0" name="deleted"/>
        </property>
        <bag name="articles" table="link_article_tag">
            <key column="tagId"/>
            <many-to-many class="cfc:www.app.models.test.Article" column="articleId"/>
        </bag>
    </class>
</hibernate-mapping>

我得到的错误是:

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class entity-name="Tag" lazy="true"
        name="cfc:www.app.models.test.Tag" table="tag">
        <id name="id" type="string">
            <column length="255" name="id"/>
        </id>
        <property name="name" type="string">
            <column name="name"/>
        </property>
        <property name="deleted" type="string">
            <column default="0" name="deleted"/>
        </property>
        <bag name="articles" table="link_article_tag">
            <key column="tagId"/>
            <many-to-many class="cfc:www.app.models.test.Article" column="articleId"/>
        </bag>
    </class>
</hibernate-mapping>
08/02 16:06:27[jrpp-170]休眠错误-[Macromedia][SQLServer JDBC驱动程序][SQLServer]列名“已删除”无效

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class entity-name="Tag" lazy="true"
        name="cfc:www.app.models.test.Tag" table="tag">
        <id name="id" type="string">
            <column length="255" name="id"/>
        </id>
        <property name="name" type="string">
            <column name="name"/>
        </property>
        <property name="deleted" type="string">
            <column default="0" name="deleted"/>
        </property>
        <bag name="articles" table="link_article_tag">
            <key column="tagId"/>
            <many-to-many class="cfc:www.app.models.test.Article" column="articleId"/>
        </bag>
    </class>
</hibernate-mapping>

有人能看出我做错了什么吗?两个表中都有一个已删除的列,但链接表中没有。

多对多的
属性行为非常奇怪

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class entity-name="Tag" lazy="true"
        name="cfc:www.app.models.test.Tag" table="tag">
        <id name="id" type="string">
            <column length="255" name="id"/>
        </id>
        <property name="name" type="string">
            <column name="name"/>
        </property>
        <property name="deleted" type="string">
            <column default="0" name="deleted"/>
        </property>
        <bag name="articles" table="link_article_tag">
            <key column="tagId"/>
            <many-to-many class="cfc:www.app.models.test.Article" column="articleId"/>
        </bag>
    </class>
</hibernate-mapping>
为了调试它,激活Hibernate日志记录是原始的。 请参阅本帖:

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class entity-name="Tag" lazy="true"
        name="cfc:www.app.models.test.Tag" table="tag">
        <id name="id" type="string">
            <column length="255" name="id"/>
        </id>
        <property name="name" type="string">
            <column name="name"/>
        </property>
        <property name="deleted" type="string">
            <column default="0" name="deleted"/>
        </property>
        <bag name="articles" table="link_article_tag">
            <key column="tagId"/>
            <many-to-many class="cfc:www.app.models.test.Article" column="articleId"/>
        </bag>
    </class>
</hibernate-mapping>
举个例子:

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class entity-name="Tag" lazy="true"
        name="cfc:www.app.models.test.Tag" table="tag">
        <id name="id" type="string">
            <column length="255" name="id"/>
        </id>
        <property name="name" type="string">
            <column name="name"/>
        </property>
        <property name="deleted" type="string">
            <column default="0" name="deleted"/>
        </property>
        <bag name="articles" table="link_article_tag">
            <key column="tagId"/>
            <many-to-many class="cfc:www.app.models.test.Article" column="articleId"/>
        </bag>
    </class>
</hibernate-mapping>
第1条氟氯化碳

/**
 * @output false
 * @persistent true
 * @table article
 */
component {

    property name="id" fieldtype="id";
    property name="title";

    property 
        name="tags" singularname="tag" 
        fieldtype="many-to-many" cfc="Tag" linktable="link_article_tag" fkcolumn="articleId" 
        inversejoincolumn="tagId" where=" deleted = 0 "
    ;

}
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class entity-name="Tag" lazy="true"
        name="cfc:www.app.models.test.Tag" table="tag">
        <id name="id" type="string">
            <column length="255" name="id"/>
        </id>
        <property name="name" type="string">
            <column name="name"/>
        </property>
        <property name="deleted" type="string">
            <column default="0" name="deleted"/>
        </property>
        <bag name="articles" table="link_article_tag">
            <key column="tagId"/>
            <many-to-many class="cfc:www.app.models.test.Article" column="articleId"/>
        </bag>
    </class>
</hibernate-mapping>
Tag.cfc

/**
 * @output false
 * @persistent true
 * @table tag
 */
component {

    property name="id" fieldtype="id";
    property name="name";
    property name="deleted" dbdefault="0";

    property 
        name="articles" singularname="article" 
        fieldtype="many-to-many" cfc="Article" linktable="link_article_tag" fkcolumn="tagId" 
        inversejoincolumn="articleId"
    ;

}
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class entity-name="Tag" lazy="true"
        name="cfc:www.app.models.test.Tag" table="tag">
        <id name="id" type="string">
            <column length="255" name="id"/>
        </id>
        <property name="name" type="string">
            <column name="name"/>
        </property>
        <property name="deleted" type="string">
            <column default="0" name="deleted"/>
        </property>
        <bag name="articles" table="link_article_tag">
            <key column="tagId"/>
            <many-to-many class="cfc:www.app.models.test.Article" column="articleId"/>
        </bag>
    </class>
</hibernate-mapping>
当我尝试列出所有类似以下内容的文章时,请参见hibernate日志中出现的内容:

select
    tags0_.articleId as articleId6_1_,
    tags0_.tagId as tagId1_,
    tag1_.id as id0_0_,
    tag1_.name as name0_0_,
    tag1_.deleted as deleted0_0_ 
from
    link_article_tag tags0_ 
inner join
    tag tag1_ 
        on tags0_.tagId=tag1_.id 
where
    tags0_.deleted = 0 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class entity-name="Tag" lazy="true"
        name="cfc:www.app.models.test.Tag" table="tag">
        <id name="id" type="string">
            <column length="255" name="id"/>
        </id>
        <property name="name" type="string">
            <column name="name"/>
        </property>
        <property name="deleted" type="string">
            <column default="0" name="deleted"/>
        </property>
        <bag name="articles" table="link_article_tag">
            <key column="tagId"/>
            <many-to-many class="cfc:www.app.models.test.Article" column="articleId"/>
        </bag>
    </class>
</hibernate-mapping>
该死!WTF:| tags0_==联接表。。。你知道怎么了吗

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class entity-name="Tag" lazy="true"
        name="cfc:www.app.models.test.Tag" table="tag">
        <id name="id" type="string">
            <column length="255" name="id"/>
        </id>
        <property name="name" type="string">
            <column name="name"/>
        </property>
        <property name="deleted" type="string">
            <column default="0" name="deleted"/>
        </property>
        <bag name="articles" table="link_article_tag">
            <key column="tagId"/>
            <many-to-many class="cfc:www.app.models.test.Article" column="articleId"/>
        </bag>
    </class>
</hibernate-mapping>
为了理解这种行为,我将使用
this.ormSettings.saveMapping=true
以下是文件:

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class entity-name="Tag" lazy="true"
        name="cfc:www.app.models.test.Tag" table="tag">
        <id name="id" type="string">
            <column length="255" name="id"/>
        </id>
        <property name="name" type="string">
            <column name="name"/>
        </property>
        <property name="deleted" type="string">
            <column default="0" name="deleted"/>
        </property>
        <bag name="articles" table="link_article_tag">
            <key column="tagId"/>
            <many-to-many class="cfc:www.app.models.test.Article" column="articleId"/>
        </bag>
    </class>
</hibernate-mapping>
生成的SQL将变为:

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class entity-name="Tag" lazy="true"
        name="cfc:www.app.models.test.Tag" table="tag">
        <id name="id" type="string">
            <column length="255" name="id"/>
        </id>
        <property name="name" type="string">
            <column name="name"/>
        </property>
        <property name="deleted" type="string">
            <column default="0" name="deleted"/>
        </property>
        <bag name="articles" table="link_article_tag">
            <key column="tagId"/>
            <many-to-many class="cfc:www.app.models.test.Article" column="articleId"/>
        </bag>
    </class>
</hibernate-mapping>
select
    tags0_.articleId as articleId62_1_,
    tags0_.tagId as tagId1_,
    tag1_.id as id59_0_,
    tag1_.name as name59_0_,
    tag1_.deleted as deleted59_0_ 
from
    link_article_tag tags0_ 
inner join
    tag tag1_ 
        on tags0_.tagId=tag1_.id 
where
    tag1_.deleted = 0 
这种方法有效,但不利于代码维护和可读性。
如果有人有更好的解决方案,我很感兴趣。

到目前为止,我找到的唯一解决方法是使用
orExecuteQuery()重写getter
。在那里,我可以直接查询对象并查找这样的内容。就我个人而言,我更喜欢使用cfscript,因此我的代码如下所示:

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class entity-name="Tag" lazy="true"
        name="cfc:www.app.models.test.Tag" table="tag">
        <id name="id" type="string">
            <column length="255" name="id"/>
        </id>
        <property name="name" type="string">
            <column name="name"/>
        </property>
        <property name="deleted" type="string">
            <column default="0" name="deleted"/>
        </property>
        <bag name="articles" table="link_article_tag">
            <key column="tagId"/>
            <many-to-many class="cfc:www.app.models.test.Article" column="articleId"/>
        </bag>
    </class>
</hibernate-mapping>
    <bag name="tags" table="link_article_tag">
        <key column="articleId"/>
        <many-to-many class="cfc:www.app.models.test.Tag" column="tagId" where=" deleted = 0 "/>
    </bag>
public array function getSettings() {
    return ORMExecuteQuery("SELECT s FROM template t JOIN t.settings s WHERE t.id=:id AND s.deleted=:deleted", {
        deleted=false, id=this.getId()
    });
}
注意事项–未测试的示例

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class entity-name="Tag" lazy="true"
        name="cfc:www.app.models.test.Tag" table="tag">
        <id name="id" type="string">
            <column length="255" name="id"/>
        </id>
        <property name="name" type="string">
            <column name="name"/>
        </property>
        <property name="deleted" type="string">
            <column default="0" name="deleted"/>
        </property>
        <bag name="articles" table="link_article_tag">
            <key column="tagId"/>
            <many-to-many class="cfc:www.app.models.test.Article" column="articleId"/>
        </bag>
    </class>
</hibernate-mapping>
当然,您不必像我一样使用参数,您可以使用
deleted=false
,但这取决于您(我个人喜欢使用参数)

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class entity-name="Tag" lazy="true"
        name="cfc:www.app.models.test.Tag" table="tag">
        <id name="id" type="string">
            <column length="255" name="id"/>
        </id>
        <property name="name" type="string">
            <column name="name"/>
        </property>
        <property name="deleted" type="string">
            <column default="0" name="deleted"/>
        </property>
        <bag name="articles" table="link_article_tag">
            <key column="tagId"/>
            <many-to-many class="cfc:www.app.models.test.Article" column="articleId"/>
        </bag>
    </class>
</hibernate-mapping>
另外,不要忘记多对多属性上的
singularName
属性

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class entity-name="Tag" lazy="true"
        name="cfc:www.app.models.test.Tag" table="tag">
        <id name="id" type="string">
            <column length="255" name="id"/>
        </id>
        <property name="name" type="string">
            <column name="name"/>
        </property>
        <property name="deleted" type="string">
            <column default="0" name="deleted"/>
        </property>
        <bag name="articles" table="link_article_tag">
            <key column="tagId"/>
            <many-to-many class="cfc:www.app.models.test.Article" column="articleId"/>
        </bag>
    </class>
</hibernate-mapping>

与此相关的是,我在两个对象上都遇到了使用属性的问题。在这种情况下,您实际上只需要在模板对象上使用它们。这样想:模板需要知道它的设置,但设置不需要知道它们所属的模板——以这种方式在两个对象上使用属性在某些情况下可能会导致错误。

不知道你在那篇文章的后半部分说了些什么。但是我把where子句换成了“settings\u 1\u.deleted='false'”,这是一种攻击。但这是有效的。如何为sql生成别名?我能指望它不会改变吗?事实上,在这种情况下,管理Hibernate映射看起来非常糟糕。我也遇到过同样的问题,但也无法解决。因此,问题在于where子句查询的是链接表,而不是其他对象表。那么我们如何解决这个问题呢?
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class entity-name="Tag" lazy="true"
        name="cfc:www.app.models.test.Tag" table="tag">
        <id name="id" type="string">
            <column length="255" name="id"/>
        </id>
        <property name="name" type="string">
            <column name="name"/>
        </property>
        <property name="deleted" type="string">
            <column default="0" name="deleted"/>
        </property>
        <bag name="articles" table="link_article_tag">
            <key column="tagId"/>
            <many-to-many class="cfc:www.app.models.test.Article" column="articleId"/>
        </bag>
    </class>
</hibernate-mapping>