我刚刚开始使用Teradata,我在Teradata遇到了一个名为"Rows unbounded preceding"的Ordered Analytical Function.我尝试了几个网站来了解这个功能,但是所有这些网站都使用了一个复杂的例子来解释它.能否请你给我一个天真的例子,以便我能清楚地了解基础知识.
对于百万分之一的时间,我本来希望IN在Java中使用运算符,类似于INSQL中的运算符.它可以作为编译器语法糖实现.所以这
if (value in (a, b, c)) {
}
else if (value in (d, e)) {
}
Run Code Online (Sandbox Code Playgroud)
......真的很棒.事实上,上面的内容与这里相当冗长(并且不适用于原语)的构造相同:
if (Arrays.asList(a, b, c).contains(value)) {
}
else if (Arrays.asList(d, e).contains(value)) {
}
Run Code Online (Sandbox Code Playgroud)
或者这样的int,long和类似的形式:
switch (value) {
case a:
case b:
case c:
// ..
break;
case d:
case e:
// ..
break;
}
Run Code Online (Sandbox Code Playgroud)
或者可能有更高效的实现.
这样的东西会成为Java 8的一部分吗?如果没有,我怎么能提出这样的建议呢?或者,我现在可以使用任何等效的构造吗?
有人能指出一些关于可用于Java的不同Query DSL库之间性能比较的资源,如:Querydsl,jOOQ,JEQUEL,activejdbc,iciql等等......
背景:我使用Spring JDBC模板,但仍然需要以纯字符串格式编写查询.虽然我在编写直接查询时没有问题,但我担心直接依赖于DB表名.我不想使用任何ORM框架,如Hibernate或JPA/EclipseLink.我需要尽可能高的原始性能(IMO,它们适用于更多以CRUD为中心的应用程序).我可以为这些DSL提供一些轻微的开销,只要它有点(我相信,它主要是StringBuilder/String连接!)
我考虑过在某些xml中使用外部化的命名查询.但只是试图评估不同的Query DSL库提供的价值.
编辑:更多关于我的要求: 我想知道使用他们的API方法构建中等复杂查询时这些之间的性能比较.我需要的是使用任何这些查询DSL库生成查询字符串并将其传递给Spring JDBC模板.所以,我想知道如果添加这个中间步骤会导致相当大的性能损失,我想使用命名查询或构建我自己的库,它只使用StingBuilder或类似的方法
用jOOQ,iciql,QueryDSL更新我的经验:
虽然我错过了在我的原帖中提到这一点,但我也热衷于易用性和我在实体类中需要的开销(如果需要任何额外的注释或实现).
jOOQ:
Iciql:
QueryDSL:
(所有观察对我都知之甚少;如果其中任何一个不正确,请更正)
综上所述,我坚持编写命名查询:(但由于Lukas Eder的答案似乎解释了我原来的帖子关注(表现),我接受了他的.
显然,Java本身不支持无符号数字类型,并且不会很快改变(从2002年开始的评论).但是,在使用MySQL等数据库时,它们可能会偶尔派上用场.有很多问题涉及如何模拟无符号数.例如:
所有这些肤浅描述它是如何能做到.但是它有什么实际图书馆去所有的方式和实施适当的包装UByte,UShort,UInteger,ULong?优选地,那些包装器将延伸java.lang.Number并提供类似于其的算术API java.math.BigInteger.
从本文档中可以看出,有很多需要考虑的问题,以及可能出错的问题(例如,如何按位移位,如何乘法等),所以我不想自己做.此外,我不想只使用下一个更高的类型(例如,Short而不是Byte等).我想的概念8-bit,16-bit,32-bit,64-bit号码保留,与数据库提供最好的交互,例如.
更新:
在你回答之前!考虑一下我知道所有的解决方法,但我真的很想拥有具有上述属性的4种类型.也许有人已经这样做了,所以这就是我问的原因.无需提醒我解决方法.
Maven有时候有点过头了......我创建了一个库,它对slf4j和log4j有可选的依赖.通过可选,我的意思是:
目前,我已将该依赖标记为"可选"和"已提供":
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
<type>jar</type>
<scope>provided</scope>
<optional>true</optional>
</dependency>
Run Code Online (Sandbox Code Playgroud)
但是我的一些用户报告了问题,因为他们不需要log4/slf4j.我的依赖是否正确?不幸的是,我发现官方文档有点过于抽象,无法理解这个问题.
有没有办法获得从运行JDBC查询获得的ResultSet来延迟加载?我希望每行都按照我的要求加载,而不是事先加载.
我喜欢在这里使用这个方法:
org.apache.commons.lang.ObjectUtils.equals(Object object1, Object object2)
Run Code Online (Sandbox Code Playgroud)
唯一的缺点(例如,与Google Guava相比),我无法静态导入该方法.即这没用:
import static org.apache.commons.lang.ObjectUtils.equals;
Run Code Online (Sandbox Code Playgroud)
...因为我的Eclipse编译器在编写时无法正确链接该方法
equals(obj1, obj2);
Run Code Online (Sandbox Code Playgroud)
错误是:
Object类型中的方法equals(Object)不适用于参数(...,...)
这是为什么?如果在任何超类型中存在具有相同名称(但不是相同的签名)的方法,我的静态导入方法是否不适用?这是在JLS中正式指定的吗?还是一些Eclipse编译问题?
UPDATE
这也不起作用:
import static org.apache.commons.lang.ObjectUtils.defaultIfNull;
public class Test {
void test() {
defaultIfNull(null, null);
// ^^ compilation error here
}
void defaultIfNull() {
}
}
Run Code Online (Sandbox Code Playgroud)
javac错误消息:
Test.java:5: defaultIfNull() in Test cannot be applied to (<nulltype>,<nulltype>)
defaultIfNull(null, null);
^
1 error
Run Code Online (Sandbox Code Playgroud) 我最近发现并写了一篇关于这样一个事实的博客:有可能通过javac编译器偷看一个已检查的异常,并将它扔到不能抛出它的地方.这在Java 6和7中编译并运行,抛出一个SQLExceptionwithout throws或catch子句:
public class Test {
// No throws clause here
public static void main(String[] args) {
doThrow(new SQLException());
}
static void doThrow(Exception e) {
Test.<RuntimeException> doThrow0(e);
}
static <E extends Exception> void doThrow0(Exception e) throws E {
throw (E) e;
}
}
Run Code Online (Sandbox Code Playgroud)
生成的字节码表示JVM并不真正关心已检查/未检查的异常:
// Method descriptor #22 (Ljava/lang/Exception;)V
// Stack: 1, Locals: 1
static void doThrow(java.lang.Exception e);
0 aload_0 [e]
1 invokestatic Test.doThrow0(java.lang.Exception) : void [25]
4 return
Line numbers:
[pc: …Run Code Online (Sandbox Code Playgroud) 在Hibernate 4.x中,我曾经生成并导出了注释实体中定义的模式,如下所示(使用Spring在类路径上查找带注释的实体):
Connection connection =
DriverManager.getConnection("jdbc:h2:mem:jooq-meta-extensions", "sa", "");
Configuration configuration = new Configuration()
.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
// [...] adding annotated classes to Configuration here...
configuration.generateSchemaCreationScript(
Dialect.getDialect(configuration.getProperties()));
SchemaExport export = new SchemaExport(configuration, connection);
export.create(true, true);
Run Code Online (Sandbox Code Playgroud)
这在Hibernate 5.0中不再有效:
除了以下内容之外,我没有在迁移指南中找到任何明显的引用变化:
从配置中删除了相当多的方法
基于一组带注释的实体,使用Hibernate 5.0在现有JDBC连接上生成和导出数据库的正确方法是什么?(基于JPA的纯解决方案也很好)
(注意,只是删除呼叫generateSchemaCreationScript()似乎工作,但我宁愿确保这是正确的)
使用Java 8 StreamAPI,我想注册一个"完成钩子",类似于:
Stream<String> stream = Stream.of("a", "b", "c");
// additional filters / mappings that I don't control
stream.onComplete((Completion c) -> {
// This is what I'd like to do:
closeResources();
// This might also be useful:
Optional<Throwable> exception = c.exception();
exception.ifPresent(e -> throw new ExceptionWrapper(e));
});
Run Code Online (Sandbox Code Playgroud)
我为什么要那么做的原因是因为我想包装在一个资源Stream的API客户端,消费,我想的是Stream,一旦它被消耗自动清理资源.如果可能,那么客户可以致电:
Collected collectedInOneGo =
Utility.something()
.niceLookingSQLDSL()
.moreDSLFeatures()
.stream()
.filter(a -> true)
.map(c -> c)
.collect(collector);
Run Code Online (Sandbox Code Playgroud)
而不是目前所需要的:
try (Stream<X> meh = Utility.something()
.niceLookingSQLDSL()
.moreDSLFeatures()
.stream()) {
Collected collectedWithUglySyntacticDissonance = …Run Code Online (Sandbox Code Playgroud) java ×8
jls ×2
equals ×1
exception ×1
generics ×1
hbm2ddl ×1
import ×1
in-operator ×1
java-8 ×1
java-stream ×1
jdbc ×1
jooq ×1
jpa ×1
lazy-loading ×1
log4j ×1
maven ×1
numbers ×1
performance ×1
querydsl ×1
resultset ×1
spring-jdbc ×1
sql ×1
static ×1
teradata ×1
unsigned ×1