【问题标题】:Two Table Query in Groovy scriptGroovy 脚本中的两个表查询
【发布时间】:2012-01-22 05:16:46
【问题描述】:

如何在我的 ProductsController 脚本中处理 grails 中的这个 SQL 查询?请注意它的两个表,其中包含产品 id 的连接。

SELECT p.*,pd.* 
FROM products p, products_description pd 
WHERE p.products_id=pd.products_id
ORDER BY p.products_date_added DESC 

显然我不能这样做:

def all= {
    def a
     a = Products.find("FROM products p, products_description pd 
      WHERE p.products_id=pd.products_id ORDER BY p.products_date_added DESC")
     render a as JSON
}

【问题讨论】:

  • 你会停止编辑我的标题吗?它是一个 Groovy 脚本而不是 GORM finder,因此我正在编辑的文件是 ProductsCopntroller.groovy ...
  • 这是一个 Grails 控制器,您尝试在其中编写一个查找器,与 GORM 交互。它在 groovy 中的事实更像是一个副作用,但是如果你希望给它留下一个不太准确的标题,那就这样吧......
  • 经验不足的人会比 GORM finder 更多地搜索 Groovy 脚本……这就是我要搜索的内容。这是我第一次听说 GORM finder...
  • 如果他们真的在寻找一个独立的 groovy 解决方案,这将不是没有帮助...GORM underpins Grails

标签: sql hibernate grails join groovy


【解决方案1】:

您可以使用Many-to-one and one-to-one 关系并让 GORM 为您处理关联。

class Products {
    ProductsDescription description
    ...
    static mapping = {
        description column: 'products_id'
    }
}

然后您可以通过引用访问描述:

a = products.listOrderByProductsDateAdded(order: 'desc')
a.description.productsDescription

【讨论】:

  • 抱歉,这不起作用,因为我无法定义关系,因为表已经设置,我必须通过 SQL 查询向 Jon...我正在连接到旧数据库,所以代码每个表都被锁定了。
  • @JPM 这就是我的假设。这就是为什么我为你的外键添加了一个静态映射。
  • 这不会在 Products 类上编译错误,并带有“不能将多列属性视为单列属性”
  • 问题是旧表的 id 列名称是 product_id 而不是 id。我遇到了很多问题,大多数加入类文件的解决方案都不起作用,因为这不是真正的 ORM 数据库。
  • 我尝试了您的示例,使表格对 GORM 更友好,但我仍然无法让它工作 我收到此错误 Unknown column 'this_.products_id' in 'field list'
【解决方案2】:

如果您坚持使用自定义 sql 查询而不是任何 grails 动态查找器,则可以使用以下代码:

    def session = sessionFactory.getCurrentSession() // a reference to the sessionFactory is injected in all controllers and services that have a sessionFactory variable defined
     Query query = session.createSQLQuery("SELECT p.*,pd.* 
     FROM products p, products_description pd 
     WHERE p.products_id=pd.products_id
     ORDER BY p.products_date_added DESC");
     def result = query.list()

您必须向控制器添加一个名为 sessionFactory 的变量。像这样的:

    class ProductsController = {
      def sessionFactory

结果列表将是列表的列表。主列表的每个元素都是大小为 2 的列表,第一个元素作为产品,第二个元素作为产品描述。

【讨论】:

  • 我按照你的例子得到了这个错误:ERROR errors.GrailsExceptionResolver - 处理请求时发生异常:[GET] /mygrails/prods/all org.hibernate.MappingException:没有 JDBC 类型的方言映射: -1
  • 没关系弄清楚为什么,似乎是 Text 列有问题,所以我将类型从 Text 更改为 Varchar (10000)。谢谢!
  • 如果要将字符串映射到数据库中的文本字段,则需要在映射闭包中指定。您必须在域类的映射闭包中添加 type : 'text'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
  • 2015-08-05
相关资源
最近更新 更多