小编Eti*_*veu的帖子

使用querydsl-jpa/querydsl-sql的平均日期差异

我正在尝试使用QueryDSL计算平均日期差异.

我创建了一个小项目,以简化的方式演示我想要完成的任务(真正的查询要复杂得多,有大量的连接/ where/sort子句).我们有一个带有字段的CustomerbirthDate,我们正在努力获得客户的平均年龄(以秒为单位).我们也想要最大年龄,但让我们关注这篇文章的平均值.

我尝试使用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从中受益.

这是我的问题:

  1. 是否可以使用querydsl-jpa计算平均日期差异,让它可以使用JPA 2.1支持调用本机数据库函数(可能使用Expressions.numberTemplate())?或者我们被迫使用querydsl-sql?

  2. 如果我们不得不使用querydsl-SQL,我们如何产生既QCustomerSCustomerQCustomer目前使用插件"com.mysema.maven:apt-maven-plugin"从Customer实体生成.如果我理解正确,我必须使用不同的插件(com.querydsl:querydsl-maven-plugin)来生成SCustomer查询类型?

    在查看querydsl-sql-example时,我没有看到任何实体类,所以我猜查询类型是由QueryDSL从数据库模式生成的?有没有办法从实体生成SCustomer查询类型,就像我们使用querydsl-jpa一样?

  3. 如果我们使用querydsl-sql,有没有办法在querydsl-sql查询中"重用"我们的querydsl-jpa谓词/ sorts/joins子句?或者我们是否必须使用特定于querydsl-sql的类复制该代码?

  4. 我也在考虑创建一个委托的数据库函数TIMESTAMPDIFF(SECOND, x, y),但它不是很便携......

  5. 我错过了什么吗?有没有更简单的方法来做我想做的事情?

jpql querydsl

6
推荐指数
1
解决办法
1137
查看次数

Scalatest自定义匹配器“应包含”

这是我经常遇到的情况,但是我还没有找到解决方案。

假设您有一个人员列表,而您只想验证人员名称。这有效:

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”可以不编译。

欢迎任何建议。

scala scalatest

6
推荐指数
1
解决办法
1300
查看次数

docker非root用户绑定安装权限,带有--userns-remap

全部:尝试使绑定​​安装权限正常运行。

我的目标是在容器中绑定装入卷,以便:

  • (a)容器未以root用户身份运行入口点
  • (b)docker-daemon配置了--userns-remap,因此容器在主机上没有根
  • (c)我可以使用容器绑定安装和读写普通用户可读写的卷(主机上的UID:GID 1000)
  • (d)创建文件时,它们都具有我的常规主机用户的权限,而不是root或没有权限。

从安全角度来看,我们要避免容器在主机上具有根目录(这很容易理解),这是要求(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)

linux ubuntu docker

6
推荐指数
0
解决办法
2584
查看次数

接受任何在traala中扩展trait作为参数的case类

我需要一个函数来接受任何扩展特征的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的类.

scala

5
推荐指数
1
解决办法
2203
查看次数

Docker Kerberos WebHDFS AuthenticationException:未经授权

我有一个 Spring 应用程序,它使用 WebHDFS 从 HDFS 读取文件。当我在 IDEA 中测试它时,它可以工作。但是在我构建项目并在本地虚拟机或连接到 HDFS 的服务器上部署 Docker 映像后,我得到:

AuthenticationException: Unauthorized
Run Code Online (Sandbox Code Playgroud)

在我的本地机器上,我必须定期初始化令牌

kinit
Run Code Online (Sandbox Code Playgroud)

用于认证。如果我不这样做,我会得到同样的错误。我在服务器上测试了没有 Docker 的应用程序,它也可以工作。我认为 Docker 映像没有看到令牌。但我不知道该怎么办。

Kerberos 用于安全。

有什么建议吗?

spring kerberos hdfs docker webhdfs

5
推荐指数
1
解决办法
3685
查看次数

从番石榴中删除(谷歌)Multimap永远不会删除密钥本身.为什么?怎么办?

我正在使用番石榴的谷歌收藏库,我相信最新的版本.

我发现,一旦我从地图中移除了给定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)

java collections multimap guava

4
推荐指数
2
解决办法
5558
查看次数

List如何成为monad?

我认为我对Monads和monadic操作有一个基本的把握,但仍然有点停留在理解monadic类型的神奇特征如何被添加到底层类型(希望这是有道理的).

例如,我正在阅读有关a List[T]是monad的信息.但是,如果我flatMapmap一些列表依次在一个for理解中,那么它是不是真的flatMap,map那提供了monadic魔法?

如果我创造了一个List<String>那么monadic魔法是如何添加的?或者List<T>在Scala中始终是一个monad,因为它恰好是语言已经提供内置monadic支持的那些容器之一?

monads scala

4
推荐指数
2
解决办法
2034
查看次数

如果我更改Java Exception类扩展的基类,是否需要更新serialVersionUID值?

请考虑以下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)

java serialization exception serialversionuid

3
推荐指数
1
解决办法
1827
查看次数