Orm Coldfusion表单中访问器的条件

Orm Coldfusion表单中访问器的条件,orm,coldfusion,entity,coldfusion-9,accessor,Orm,Coldfusion,Entity,Coldfusion 9,Accessor,加载组件后,是否能够使用设置的条件访问该对象的属性?例如,如果人与宠物之间存在一对多的关系,则加载指定特定人的人,然后希望将所述所有人的宠物拉到宠物属于特定物种的位置。比如猫和狗 <cfset person=EntityLoad("person", {name="#URL.name#"})> <cfset pets=person[1].getPets()> 还有什么叫getPets where type='dog'之类的吗 或者我必须循环浏览宠物,为每种类型创建结构

加载组件后,是否能够使用设置的条件访问该对象的属性?例如,如果人与宠物之间存在一对多的关系,则加载指定特定人的人,然后希望将所述所有人的宠物拉到宠物属于特定物种的位置。比如猫和狗

<cfset person=EntityLoad("person", {name="#URL.name#"})>
<cfset pets=person[1].getPets()>

还有什么叫getPets where type='dog'之类的吗


或者我必须循环浏览宠物,为每种类型创建结构并以这种方式处理它们吗?

如果可能的话,你不应该循环浏览宠物:区分宠物类型最好留给与它们有关系的对象或与这些对象一起工作的服务

一种方法是向
Person
添加一个方法,该方法将返回一种宠物。我们在当前的项目中使用了类似的东西

array function getDogs() {
    var HQL = "where petType = 'dog'";
    return ormGetSession().createFilter(this.getPets(),HQL).list();
}
您还可以使其更通用:

array function getPets( required string petType ) {
    var HQL = "where petType = '" & arguments.petType & "'";
    return ormGetSession().createFilter(this.getPets(),HQL).list();
}
另一种方法是在检索宠物时,在
Person
对象的关系中使用
where
属性。我们也使用类似的方法:

property name="cats" type="array" fieldtype="one-to-many" cfc="model.Pets" fkcolumn="PERSON_ID" where="PET_TYPE = 'cat'" lazy="false";
property name="dogs" type="array" fieldtype="one-to-many" cfc="model.Pets" fkcolumn="PERSON_ID" where="PET_TYPE = 'dog'" lazy="false";
请注意,这些示例对应用程序和数据库的结构做出了一些假设:在
model
文件夹中有一个映射到数据库中的表的Pets对象;此表有一个PET_类型列(映射到petType属性),其中包含小写的PET类型;
Person
对象映射到一个带有名为
Person\u ID
主键的表,该主键也是
Pets
表中的外键


此外,在考虑这些和其他方法时,你应该考虑你打算如何接触宠物。如果您有大量宠物,关闭延迟加载可能会造成性能下降,特别是如果您要存储多个类型的宠物(因此在初始化一个人时要多次通过宠物表)。如果你不经常接触宠物,你可能不需要单独的财产;只要有一个getPets()函数就足够了

很好的答案-我们一直在寻找一种更有效的方法来实现这一点,而无需使用WHERE子句为每个条件创建单独的关系属性。在所有关系对象都已加载的情况下,使用Hibrate筛选器似乎是一个非常优雅的解决方案(例如,假设我希望在同一页面上的不同区域显示每个pettype)。