首页 文章

Scala Bean强制::缺少LINQ

提问于
浏览
1

Update

Play 2.0的Scala版本将以ANORM为特色,这与Querulous类似,因为它们都是JDBC包装器而不是ORM . 这是使用解析器组合器的ANORM查询强制:

SQL("""
        select * from Country c 
        join CountryLanguage l on l.CountryCode = c.Code 
        where c.code = 'FRA';
    """
    ).as(
        str("name") ~< spanM(
            by=str("code"), str("language") ~< str("isOfficial") 
        ) ^^ { 
            case country~languages => 
                SpokenLanguages(
                    country,
                    languages.collect { case lang~"T" => lang } headOption,
                    languages.collect { case lang~"F" => lang }
                )
        } ?
    )

多行查询“”“sql”“”很好,我喜欢,但强制,请,没有;-)在Groovy中,使用相同查询的bean强制是1-liner:

List[Country] c = sql.rows("select * from country")?.collect{ it.toRowResult() as Country }

在groovy中的null安全操作符(?.might-be-null)非常方便,scala似乎需要Some()Option []组合来处理可能的null结果 . Scala编码器是否像Scala中的空值处理一样?

我想这篇文章的主要内容是:Scala能否在保留编译器类型安全代码的同时提供脚本语言的简洁性?鉴于Scala可能比C#(无意识的火焰)更强大/更具表现力,那么一个完整的Scala LINQ必须是可能的 . 此外,由于Scala跨越了功能和OO范例,因此它还必须能够实现Groovy级别的简洁(例如,上面的1-liner query-bean-coercion) .

如果这些假设成立,那么为什么现有的scala ORM和jdbc包装器需要如此多的样板文件而不是C#上的groovy和LINQ?显然,我是一个寻找裸机DSL的理想主义者,其实现要么非常简洁,要么密切反映它们所代表的底层语言(如在LINQ-to-SQL中) .

Original

一直在浏览各种Scala ORM(squeryl,daomapper,其他人将在后面填写)和SQL帮助框架(到目前为止很乱)

作为Scala的新手和一般的强类型语言,有一点是我需要在每个查询结果中指定每列的类型(String,Int等) .

即将在这里上过夜火车,但这件事让我很震惊,所以把它放在那里(当我再次回到网上时,会添加一些例子,使这有点不那么絮絮叨叨)

现在,来自Querulous在github上的自述文件中的快速内容:

val users = queryEvaluator.select("SELECT * FROM users WHERE id IN (?) OR name = ?", List(1,2,3), "Jacques") { row =>
  new User(row.getInt("id"), row.getString("name"))
}

虽然我理解编译器需要知道你使用的每个“对象”的类型,但是当域类本身已经声明id为的时,必须指定“row.getInt('id')”似乎非DRY . 类型Int .

因此,出于相当程度的无知,我会问,为什么Scala ORM和SQL辅助框架不为开发人员提供允许推断或隐式结果集的实现模型?

只是为了放入上下文,我来自Grails,它有一个非常好的域/验证模型和其他框架之间的好东西,但遭受动态语言时间浪费胖手指键入(启动时间也很痛苦) )这就是我探索Scala框架的原因 .

1 回答

相关问题