我正在尝试使用QueryDSL计算平均日期差异.
我创建了一个小项目,以简化的方式演示我想要完成的任务(真正的查询要复杂得多,有大量的连接/ where/sort子句).我们有一个带有字段的Customer类birthDate,我们正在努力获得客户的平均年龄(以秒为单位).我们也想要最大年龄,但让我们关注这篇文章的平均值.
我尝试使用querydsl-jpa编写此查询,但它失败了一个模糊的错误:
java.lang.NullPointerException
at org.hibernate.dialect.function.StandardAnsiSqlAggregationFunctions$AvgFunction.determineJdbcTypeCode(StandardAnsiSqlAggregationFunctions.java:106)
at org.hibernate.dialect.function.StandardAnsiSqlAggregationFunctions$AvgFunction.render(StandardAnsiSqlAggregationFunctions.java:100)
at org.hibernate.hql.internal.ast.SqlGenerator.endFunctionTemplate(SqlGenerator.java:233)
[...]
Run Code Online (Sandbox Code Playgroud)
我也尝试过其他方法,比如使用NumberTemplate.create(Double.class, "{0} - {1}", DateExpression.currentDate(), customer.birthDate).avg(),但它没有返回正确的值.如果我们想要以秒为单位获得日期差异,似乎我们需要找到一些方法来调用特定于数据库的日期/时间差异函数,而不仅仅是使用减号.
遗憾的是,在JPQL中似乎不可能计算日期差异,所以我猜querydsl-jpa也有局限性.因此,我们必须编写本机SQL查询,或者找到一些hack来使QueryDsl生成的JPQL调用本机数据库函数.
JPA 2.1增加了对调用数据库函数的支持,但是存在一个问题:MySQL函数采用的形式TIMESTAMPDIFF(SECOND, '2012-06-06 13:13:55', '2012-06-06 15:20:18').如果第一个参数(SECOND)是一个String,它可能是可能的,但它似乎是对某种常量的引用,并且在第一个参数未引用的情况下生成JPQL似乎很复杂.
QueryDSL增加了对日期差异的支持,但似乎大多数代码都驻留在querydsl-sql项目中,所以我想知道我是否可以通过querydsl-jpa从中受益.
这是我的问题:
是否可以使用querydsl-jpa计算平均日期差异,让它可以使用JPA 2.1支持调用本机数据库函数(可能使用Expressions.numberTemplate())?或者我们被迫使用querydsl-sql?
如果我们不得不使用querydsl-SQL,我们如何产生既QCustomer与SCustomer?QCustomer目前使用插件"com.mysema.maven:apt-maven-plugin"从Customer实体生成.如果我理解正确,我必须使用不同的插件(com.querydsl:querydsl-maven-plugin)来生成SCustomer查询类型?
在查看querydsl-sql-example时,我没有看到任何实体类,所以我猜查询类型是由QueryDSL从数据库模式生成的?有没有办法从实体生成SCustomer查询类型,就像我们使用querydsl-jpa一样?
如果我们使用querydsl-sql,有没有办法在querydsl-sql查询中"重用"我们的querydsl-jpa谓词/ sorts/joins子句?或者我们是否必须使用特定于querydsl-sql的类复制该代码?
我也在考虑创建一个委托的数据库函数TIMESTAMPDIFF(SECOND, x, y),但它不是很便携......
我错过了什么吗?有没有更简单的方法来做我想做的事情?
这是我经常遇到的情况,但是我还没有找到解决方案。
假设您有一个人员列表,而您只想验证人员名称。这有效:
persons.map(_.name) should contain theSameElementsAs(List("A","B"))
Run Code Online (Sandbox Code Playgroud)
相反,我宁愿这样写
val toName: Person => String = _.name
persons should contain theSameElementsAs(List("A","B")) (after mapping toName)
Run Code Online (Sandbox Code Playgroud)
因为这就是你怎么说
但是有时候,您想使用一个自定义匹配器,该匹配器不仅可以匹配对象的一个属性。怎么可能使用
persons should contain(..)
Run Code Online (Sandbox Code Playgroud)
语法,但能够以某种方式使用自定义匹配器?
在这两种情况下,我都可以使用Hamcrest匹配器轻松地使用JUnit或TestNG解决这两种情况,但是我还没有找到使用ScalaTest做到这一点的方法。
我尝试使用Explicitly特性中的“ before be”语法,但这是不可能的,因为这需要一个“ Normalization”,它定义了“ normalized”方法对参数和返回类型使用相同的类型。因此,不可能将Person更改为String。另外,我还没有成功实现类似trait的“ Explicitly”,因为它不喜欢我返回的Equality [。]类型和/或它不再知道原始列表类型是什么,因此使用“ _.name”可以不编译。
欢迎任何建议。
全部:尝试使绑定安装权限正常运行。
我的目标是在容器中绑定装入卷,以便:
从安全角度来看,我们要避免容器在主机上具有根目录(这很容易理解),这是要求(b)。需求a,c和d来自将容器日志发送到文件系统上绑定安装的目录的需求,因此它们可以被splunk消化。这种配置是/将是在kubernetes上进行日志记录的首选方法(有关此内容的更多信息,请参见 此处)。
有没有人能满足上述所有4个要求?
这是解决问题的最简单方法。使用--userns-remap运行Docker:
DOCKER_OPTS="--userns-remap=1000:1000"
Run Code Online (Sandbox Code Playgroud)
启动容器高山,以根用户身份运行它。观察foo.txt的权限是没有人。我认为它们是root或1000:1000,因为那就是文件系统上的内容:
dcowden@ubuntu:~/gitwork/file-perm-stuff$ docker run --rm -it -v /home/dcowden/gitwork/file-perm-stuff/testlogs:/logs alpine /bin/sh
/ # ls -ln /logs
total 0
-rw-rw-r-- 1 65534 65534 0 Aug 20 19:08 foo.txt
/ # exit
Run Code Online (Sandbox Code Playgroud)
退出容器,然后查看文件。观察它们是1000:1000拥有的,因此userns remap将它们搞砸了:
dcowden@ubuntu:~/gitwork/file-perm-stuff$ ls -ln testlogs
total 0
-rw-rw-r-- 1 1000 1000 0 Aug 20 15:08 foo.txt
dcowden@ubuntu:~/gitwork/file-perm-stuff$ ls -ln .
total 8
-rw-rw-r-- 1 1000 1000 248 Aug 20 16:07 Dockerfile
drwxrwxr-x 2 1000 1000 …Run Code Online (Sandbox Code Playgroud) 我需要一个函数来接受任何扩展特征的case类.举个例子
假设有一个特征
trait Action {
def execute(param: Parameters)
}
Run Code Online (Sandbox Code Playgroud)
并且可以传递以下参数,具体取决于它的操作类型
trait Parameters
case class A(x: String, y: Double) extends Parameters
case class B(x: Int, y:String, z: Double) extends Parameters
Run Code Online (Sandbox Code Playgroud)
用户应该能够指定它想要的参数
class Action1 extends Action {
override def execute(param: A)
}
class Action2 extends Action {
override def execute(param: B)
}
Run Code Online (Sandbox Code Playgroud)
在打电话的时候
def run(t: Action) {
t.execute(new A("a", 1.0))
}
Run Code Online (Sandbox Code Playgroud)
怎么做到这一点?当我实现Action1时,它表示我将得到我们无法覆盖的错误,因为trait说execute方法接受Parameters,但是在重写时,我们需要一个扩展Parameters的类.
我有一个 Spring 应用程序,它使用 WebHDFS 从 HDFS 读取文件。当我在 IDEA 中测试它时,它可以工作。但是在我构建项目并在本地虚拟机或连接到 HDFS 的服务器上部署 Docker 映像后,我得到:
AuthenticationException: Unauthorized
Run Code Online (Sandbox Code Playgroud)
在我的本地机器上,我必须定期初始化令牌
kinit
Run Code Online (Sandbox Code Playgroud)
用于认证。如果我不这样做,我会得到同样的错误。我在服务器上测试了没有 Docker 的应用程序,它也可以工作。我认为 Docker 映像没有看到令牌。但我不知道该怎么办。
Kerberos 用于安全。
有什么建议吗?
我正在使用番石榴的谷歌收藏库,我相信最新的版本.
我发现,一旦我从地图中移除了给定K值的最终(K,V)对,地图仍然包含K的条目,其中V是空集合.
我宁愿让地图不包含这个条目.为什么我不能删除它?或者,如果我可以,怎么样?
这可能是我错过的简单事情.这是一个代码示例.谢谢.
// A plain ordinary map.
Map<Integer, Integer> hm = new HashMap<Integer, Integer>();
hm.put(1, 2);
hm.remove(1);
// Value of key 1 in HashMap: null
System.out.println("Value of key 1 in HashMap: " + hm.get(1));
// A list multimap.
ListMultimap<Integer, Integer> lmm = ArrayListMultimap.<Integer, Integer> create();
lmm.put(1, 2);
lmm.remove(1, 2);
// Value of key 1 in ArrayListMultiMap: []
System.out.println("Value of key 1 in ArrayListMultiMap: " + lmm.get(1));
// A set multimap.
SetMultimap<Integer, Integer> smm = HashMultimap.<Integer, Integer> create();
smm.put(1, …Run Code Online (Sandbox Code Playgroud) 我认为我对Monads和monadic操作有一个基本的把握,但仍然有点停留在理解monadic类型的神奇特征如何被添加到底层类型(希望这是有道理的).
例如,我正在阅读有关a List[T]是monad的信息.但是,如果我flatMap和map一些列表依次在一个for理解中,那么它是不是真的flatMap,map那提供了monadic魔法?
如果我创造了一个List<String>那么monadic魔法是如何添加的?或者List<T>在Scala中始终是一个monad,因为它恰好是语言已经提供内置monadic支持的那些容器之一?
请考虑以下Java异常类:
public class BarException extends RuntimeException {
// [...]
}
public class FooException extends BarException {
private static final long serialVersionUID = -5322002268075295537L;
// [...]
}
Run Code Online (Sandbox Code Playgroud)
如果我希望更新要删除的继承层次结构BarException,FooException直接从中派生RuntimeException,这是否需要更改serialVersionUID值?
// FooException with updated inheritance hierarchy
public class FooException extends RuntimeException {
private static final long serialVersionUID = ???;
// [...]
}
Run Code Online (Sandbox Code Playgroud)