Scala 光滑泛型查询返回类型
我正在制作一个函数,用于过滤slick中的查询,如下所示:Scala 光滑泛型查询返回类型,scala,slick,Scala,Slick,我正在制作一个函数,用于过滤slick中的查询,如下所示: class Foos(tag: Tag) extends RichTable[Foo](tag, "t_foo") { // foo slick mapping } 工作功能 object Foos extends PostgresGeneric[Foos, Foo] { private def filterQuery(query :Query[Foos,Foos#TableElementType,Seq], sear
class Foos(tag: Tag) extends RichTable[Foo](tag, "t_foo") {
// foo slick mapping
}
工作功能
object Foos extends PostgresGeneric[Foos, Foo] {
private def filterQuery(query :Query[Foos,Foos#TableElementType,Seq], searchFilter: FooFilter) = {
var filteredQuery = query
if(searchFilter.searchEntity.isDefined) {
val searchEntity = searchFilter.searchEntity.get
if(searchEntity.cancelled.isDefined) {
filteredQuery = filteredQuery.filter(p => p.cancelled === searchEntity.cancelled.get)
}
if(searchEntity.nome.isDefined) {
filteredQuery = filteredQuery.filter(p => p.nome.toLowerCase like "%"+searchEntity.nome.get.toLowerCase()+"%")
}
if(searchEntity.localidade.isDefined) {
filteredQuery = filteredQuery.filter(_.localidade === searchEntity.localidade)
}
}
filteredQuery
}
}
object Foos extends PostgresGeneric[Foos, Foo] {
private def filterQuery(query :Query[Foos,Foos#TableElementType,Seq], searchFilter: FooFilter) = {
var filteredQuery = query
if(searchFilter.searchEntity.isDefined) {
val searchEntity = searchFilter.searchEntity.get
if(searchEntity.cancelled.isDefined) {
filteredQuery = filteredQuery.filter(p => p.cancelled === searchEntity.cancelled.get)
}
if(searchEntity.nome.isDefined) {
filteredQuery = filteredQuery.filter(p => p.nome.toLowerCase like "%"+searchEntity.nome.get.toLowerCase()+"%")
}
if(searchEntity.localidade.isDefined) {
filteredQuery = filteredQuery.filter(_.localidade === searchEntity.localidade)
filteredQuery = filteredQuery.join(tableReferenceFoo2).on(_.foo2 === _.id)
}
}
filteredQuery
}
}
不工作功能
object Foos extends PostgresGeneric[Foos, Foo] {
private def filterQuery(query :Query[Foos,Foos#TableElementType,Seq], searchFilter: FooFilter) = {
var filteredQuery = query
if(searchFilter.searchEntity.isDefined) {
val searchEntity = searchFilter.searchEntity.get
if(searchEntity.cancelled.isDefined) {
filteredQuery = filteredQuery.filter(p => p.cancelled === searchEntity.cancelled.get)
}
if(searchEntity.nome.isDefined) {
filteredQuery = filteredQuery.filter(p => p.nome.toLowerCase like "%"+searchEntity.nome.get.toLowerCase()+"%")
}
if(searchEntity.localidade.isDefined) {
filteredQuery = filteredQuery.filter(_.localidade === searchEntity.localidade)
}
}
filteredQuery
}
}
object Foos extends PostgresGeneric[Foos, Foo] {
private def filterQuery(query :Query[Foos,Foos#TableElementType,Seq], searchFilter: FooFilter) = {
var filteredQuery = query
if(searchFilter.searchEntity.isDefined) {
val searchEntity = searchFilter.searchEntity.get
if(searchEntity.cancelled.isDefined) {
filteredQuery = filteredQuery.filter(p => p.cancelled === searchEntity.cancelled.get)
}
if(searchEntity.nome.isDefined) {
filteredQuery = filteredQuery.filter(p => p.nome.toLowerCase like "%"+searchEntity.nome.get.toLowerCase()+"%")
}
if(searchEntity.localidade.isDefined) {
filteredQuery = filteredQuery.filter(_.localidade === searchEntity.localidade)
filteredQuery = filteredQuery.join(tableReferenceFoo2).on(_.foo2 === _.id)
}
}
filteredQuery
}
}
错误消息
Error:(165, 76) type mismatch;
found : scala.slick.lifted.Query[(model.db.entity.Foos, model.db.entity.Foos2),(model.db.entity.Foo, model.db.entity.Foos2#TableElementType),Seq]
(which expands to) scala.slick.lifted.Query[(model.db.entity.Foos, model.db.entity.Foos2),(model.db.entity.Foo, model.db.entity.Foo2),Seq]
required: slick.driver.PostgresDriver.simple.Query[model.db.entity.Foos,model.db.entity.Foo,Seq]
(which expands to) scala.slick.lifted.Query[model.db.entity.Foos,model.db.entity.Foo,Seq]
filteredQuery = filteredQuery.join(tableReferenceFoo2).on(_.Foo2 === _.id)
第一个代码起作用,因为过滤后生成的查询始终具有相同的类型。它在联接后失败,因为类型更改
问题:
在我需要与另一个表执行联接之前,此函数一直正常工作
那么,我怎样才能以一种方式键入这个查询实例,使它接受一种可以装载任何类型查询的类型呢?可能吗?也许编译器无法确定函数的类型。你试过定义它的返回类型吗?我真的不知道返回类型。它可以是Query[Foos,Foos#TableElementType,Seq]或Query[(Foos,Foos2,FoosN),(Foos#TableElementType,Foos2#TableElementType,FoosN#TableElementType),Seq]如果它有joinsCan,你可以包括一个有效的示例和一个失败的示例,以及编译器消息?失败示例上的编译器消息是什么?