2012-08-02 2 views
1

내 개체 중 하나에서 정의한 다 대다 속성에 where 절을 추가하려고합니다. 나는 열이 존재하지 않는다는 것을 말하는 최대 절전 모드 에러를 계속 받기 때문에 뭔가 잘못하고있을 것입니다.coldfusion ORM : 다 대다 조건부 속성

<cfproperty 
    name="templates" 
    fieldtype="many-to-many" 
    cfc="Template" 
    linktable="settings_templates" 
    fkcolumn="settingsId" 
    inversejoincolumn="templateID" 
    where="deleted='false'" 
> 

내가 점점 오전 오류는 다음과 같습니다 :

8월 2일 16시 6분 27초 [설정의 CFC에서

<cfproperty 
    name="Settings" 
    fieldtype="many-to-many" 
    cfc="Setting" 
    linktable="settings_templates" 
    fkcolumn="templateID" 
    inversejoincolumn="settingsId" 
    where="deleted='false'" 
> 

: 템플릿 CFC에서

jrpp-170] HIBERNATE ERROR - [Macromedia] [SQLServer JDBC 드라이버] [SQLServer] 잘못된 열 이름이 'deleted'입니다.

내가 뭘 잘못하고 있는지 알 수 있습니까? 두 테이블 모두에 삭제 된 열이 있지만 링크 테이블에는 삭제되지 않은 열이 있습니다. 이 문제를 디버깅하기 위해

+0

그래서 문제는 where 절이 다른 개체 테이블이 아니라 연결 테이블을 쿼리한다는 것입니다. 그래서 우리가 어떻게 수정합니까? – Rumpleteaser

답변

1

where 속성 행동 대다가 매우 이상하다를 위해 ...

는 최대 절전 모드 로깅이 원시입니다 활성화합니다. 이 게시물에 당신을 참조하십시오 내가 좋아하는 모든 기사를 나열 할 때

/** 
* @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 " 
    ; 

} 

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" 
    ; 

} 

Article.cfc : http://www.rupeshk.org/blog/index.php/2009/07/coldfusion-orm-how-to-log-sql/

이 예제를 가지고 이 ormExecuteQuery('from Article'), 최대 절전 모드 로그에 첨부 된 내용 참조 :

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 

저주! 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 다음과 Application.cfc에 HBMXML 생성을 활성화거야 파일입니다

우리가 볼 수있는 것 : where 속성은 many-to-many이 아닌 bag 수준으로 설정됩니다.나는 이런 식으로 편집하는 경우 :

<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> 

생성 된 SQL이 될 :

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 

이 방법은 작동하지만 코드의 유지 보수 및 가독성에 좋지 않다. 누군가가 더 나은 해결책을 가지고 있다면, 나는 흥미 롭다.

+0

그 게시물의 후반부에 대해 무슨 말을하고 있는지 전혀 알지 못했습니다. 그러나 나는 where 절을 "settings_1_.deleted = 'false'"라고 바꿨다. 이것은 해킹이다. 그러나 작동합니다. SQL에 대해 별칭이 어떻게 생성됩니까? 나는 그것을 바꿀 수 없을까? – Rumpleteaser

+0

내 마음이 바뀌 었습니다. 그것의 너무 많은 해킹. – Rumpleteaser

+0

사실,이 경우에는 Hibernate 매핑을 관리하는 것이 매우 못 생깁니다. 나는 같은 문제를 겪어 왔고 그것도 이해할 수 없다. –

1

지금까지 내가 발견 한 유일한 방법은 ORMExecuteQuery()을 사용하여 getter를 재정의하는 것입니다. 거기에서 객체를 직접 질의하고 이와 같은 것을 찾을 수 있습니다. 개인적으로, 나는 내 코드는 다음과 같이 보일 것이다, 그래서 CFScript의에서 작업하는 것을 선호 :

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() 
    }); 
} 

N.B. - 예 당신은 방금 deleted=false을 사용할 수 있습니다, 내가 가지고있는 이 매개 변수를 사용하는을 가지고, 물론

하지 않는 테스트하지,하지만 (나는 개인적으로, 매개 변수를 사용하여 좋아하는) 당신에게 달려 있습니다.

또한 many-to-many 속성의 singularName 속성을 잊지 마세요.

관련 메모에서 두 개체의 속성을 사용하는 데 문제가있었습니다. 이 경우에는 템플릿 객체에서만 사용해야합니다. 템플릿은 템플릿의 설정을 알아야하지만 템플릿이 속한 템플릿에 대해 알아야 할 필요가 없습니다.이 방법으로 두 객체의 속성을 사용하면 오류가 발생할 수 있습니다.

+0

편집 해 주셔서 감사합니다 @ fish2000, 많은 감사하겠습니다. – WideAsleepDad