小编Vis*_*hao的帖子

如何使用@OneToMany集合进行分页

假设我有一个Post实体和一个Comment实体以及一对多的关系:

@Entity class Post {
    ...
    @OneToMany
    List<Comment> comments;
    ...
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能实现这样的分页:

Post post = //Find the post.
return post.getComments().fetch(100, 10); // Find the 11th page (page size 10);
Run Code Online (Sandbox Code Playgroud)

是否可以在JPA之上使用@OneToMany集合模拟动态分页,或者我们是否必须完全重写JPA的关联机制?(例如,创建一个可以管理分页,排序和搜索的PersistentList集合类型).

PS:我最近发现了Play!框架在JPA:Siena之上使用了一个非常有趣的库.Siena非常易于使用,并且在JPA/Hibernate之上是一个很好的抽象.但我找不到如何使用其关联进行分页.

更新:

Play框架具有类似于Django的查询语法:

Post.findAll().from(100).fetch(10);  // paging
Run Code Online (Sandbox Code Playgroud)

哪里

Post.findAll() 
Run Code Online (Sandbox Code Playgroud)

将返回一个JPAQuery对象,一个Play中的自定义查询类型.

但是有关联的集合,例如:

Post.comments
Run Code Online (Sandbox Code Playgroud)

将只返回一个List,它不支持分页或其他查询.

我想知道如何扩展它,所以

Post.comments
Run Code Online (Sandbox Code Playgroud)

还会返回一个JPAQuery对象或类似对象,然后就可以查询"查询"集合:

Post.comments.from(100).fetch(10);
Run Code Online (Sandbox Code Playgroud)

或插入新的评论而不实际获取任何评论:

Post.comments.add(new Comment(...));
Run Code Online (Sandbox Code Playgroud)

在我的第一个想法,我们可以创建一个List的子类,然后Post类将成为:

@Entity class Post {
    ...
    @OneToMany
    QueryList<Comment> comments;
    ...
}
Run Code Online (Sandbox Code Playgroud)

而且QueryList将具有fetch(),from()方法,间接于JPAQuery.

但我不知道Hibernate/JPA是否会识别它,或者干扰它.

java hibernate jpa siena playframework

16
推荐指数
1
解决办法
5746
查看次数

为什么我不能将字符串键存储在关联数组中?

我是D编程语言的新手,刚开始阅读D编程语言书.

尝试一个关联数组示例代码时遇到错误

#!/usr/bin/rdmd
import std.stdio, std.string;

void main() {
    uint[string] dict;
    foreach (line; stdin.byLine()) {
        foreach (word; splitter(strip(line))) {
            if (word in dict) continue;
            auto newId = dict.length;
            dict[word] = newId;
            writeln(newId, '\t', word);
        }   
    }   
}
Run Code Online (Sandbox Code Playgroud)

DMD显示此错误消息:

./vocab.d(11):错误:关联数组只能用不可变键赋值,而不是char []

我正在使用DMD编译2.051

我猜测关联数组的规则自TDPL书以来已经发生了变化.

我应该如何使用带有字符串键的关联数组?

谢谢.

更新:

我在本书的后半部分找到了解决方案.

在放入数组之前使用string.idup创建重复的不可变值.

所以

dict[word.idup] = newId;
Run Code Online (Sandbox Code Playgroud)

会做的.

但这有效吗?

string associative-array d

16
推荐指数
1
解决办法
2100
查看次数

我可以直接在Java中使用scala List吗?

我可以在Java中使用scala List,例如:

import scala.collection.immutable.List;
class HelloScalaList {
    public static void main (String[] args) {
        List xs = List(1, 2, 3);
        System.out.println(xs);
    }
}
Run Code Online (Sandbox Code Playgroud)

它似乎没有编译.找不到List $ .apply方法.

当我改变它

List xs = Dir.ls()
Run Code Online (Sandbox Code Playgroud)

其中Dir是我的scala类,而ls()返回一个scala List,编译器抱怨

"内部编译器错误:java.lang.ClassCastException:org.eclipse.jdt.internal.compiler.lookup.BaseTypeBinding无法强制转换为org.eclipse.jdt.internal中的org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding. compiler.lookup.BinaryTypeBinding.initializeTypeVariable(BinaryTypeBinding.java:927)"

我不知道这是什么意思.


我想在scala中编写一些库,但也希望它在Java中使用.

在我的scala类中有返回scala List的方法,对于java代码使用它们,我有两个选择:

  1. 直接在java中使用scala List

  2. 编写一个包装器类,为这些方法返回java.util.List.

我更喜欢选项1,因为否则我将不得不为几乎所有我的scala类编写一个包装类.

但我只是无法让scala List在Java中运行.

java scala-java-interop scala-collections

14
推荐指数
3
解决办法
9969
查看次数

当静态导入时,如何使用类型调用Generic方法?

我发现你可以使用特殊类型调用泛型方法,例如:

假设我们有一个通用的方法:

class ListUtils {
    public static <T> List<T> createList() {
        return new ArrayList<T>();
    }
}
Run Code Online (Sandbox Code Playgroud)

我们可以称之为:

List<Integer> intList = ListUtils.<Integer>createList();
Run Code Online (Sandbox Code Playgroud)

但是,当它静态导入时我们怎么称它呢?例如:

List<Integer> intList = <Integer>createList();
Run Code Online (Sandbox Code Playgroud)

这不起作用.

java generics static-import

13
推荐指数
1
解决办法
2676
查看次数

Hibernate JPA:如何在延迟加载ManyToOne关系时控制"Not-Found"行为?

在较旧的基于xml的hibernate中,可以使用此配置,

<many-to-one ... not-found="ignore" />

但在JPA注释中,似乎没有类似的东西.

我的问题是我们公司有这样的SQL REFERENCE定义:

authorId INT NOT NULL DEFAULT 0

这使得所有外国参考默认为"未找到"情况.当关系被懒惰加载时,会得到例外...

hibernate jpa lazy-loading

13
推荐指数
1
解决办法
1万
查看次数

Hibernate Criteria API相当于HQL select子句?

我想对两个持久化类进行组合查询.

在HQL中,这可以通过select子句来实现,

select new Family(mother, mate, offspr)
    from DomesticCat as mother
        join mother.mate as mate
        left join mother.kittens as offspr
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,Family是一个以DemesticCat作为其construtor params的联合类

什么是HQL select子句的Criteria等价物?

java orm hibernate hql criteria

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

如何使用解析器组合器进行条件检查

我试图编写一个简单的html模板引擎(为了好玩),并想解析这样的结构

A.正常行是HTML

B.如果一行开头,$则将其视为java代码行

$ if (isSuper) {
    <span>Are you wearing red underwear?</span>
$ }
Run Code Online (Sandbox Code Playgroud)

C.如果${}包装多行,其中的所有代码都应该是java代码.

D.如果一行开头$include然后在线上做一些技巧(调用另一个模板)

$include anotherTemplate(id, name)
Run Code Online (Sandbox Code Playgroud)

这将创建一个新实例anotherTemplate,并调用它的render()方法

E.和将有更多的"命令"比其他$include,例如$def,$val.

如何在解析器组合器中表达这一点?实际上它是一个条件分叉

对于1.和2.,我有这样的事情:

'$' ~> ( '{' ~> upto('}') <~ '}' |  not('{') <~ newline )
Run Code Online (Sandbox Code Playgroud)

其中,upto从Scalate的Scamel解析器借来的(我刚开始读,不是很了解)

我曾经not('{')$....代码行与${...}块区分开来.但这很麻烦,不会扩展到其他"命令"

那我该怎么办呢?

scala parser-combinators

4
推荐指数
1
解决办法
370
查看次数

QueryDSL:查询关系和属性

我正在使用带有JPA的QueryDSL.

我想查询一个实体的一些属性,它是这样的:

QPost post = QPost.post;
JPAQuery q = new JPAQuery(em);
List<Object[]> rows = q.from(post).where(...).list(post.id, post.name);
Run Code Online (Sandbox Code Playgroud)

它工作正常.

如果我想查询关系属性,例如帖子的评论:

List<Set<Comment>> rows = q.from(post).where(...).list(post.comments);
Run Code Online (Sandbox Code Playgroud)

这也没关系.

但是,当我想要一起查询关系和简单属性时,例如

List<Object[]> rows = q.from(post).where(...).list(post.id, post.name, post.comments);
Run Code Online (Sandbox Code Playgroud)

然后出了点问题,产生了错误的SQL语法.

然后我意识到在一个SQL语句中不可能一起查询它们.

QueryDSL是否有可能以某种方式处理关系并生成其他查询(就像hibernate对惰性关系所做的那样),并加载结果?

或者我应该只查询两次,然后合并两个结果列表?

PS我真正想要的是每个帖子及其评论'ID.因此,连接每个帖子的评论ID的功能更好,这种表达是否可能?

q.list(post.id, post.name, post.comments.all().id.join())
Run Code Online (Sandbox Code Playgroud)

并生成一个子查询sql (select group_concat(c.id) from comments as c inner join post where c.id = post.id)

jpa querydsl

2
推荐指数
1
解决办法
5217
查看次数

在 Sconstruct 中,如何指定 D 编程语言的包含路径

似乎 CPPPATH 不起作用

env = Environment()
target = 'app'
sources = ['app.d']
libs = ['phobos2', 'pthread', 'm', 'rt']
includes = ['/home/supertool/devel/d/vibe.d/source/vibe']

env.Program(target = target,
        source = sources,
        LIBS = libs,
        CPPPATH = includes);
Run Code Online (Sandbox Code Playgroud)

当我运行 scons 时,它会生成编译命令:

dmd -I. -c -ofapp.o app.d
Run Code Online (Sandbox Code Playgroud)

includes未添加到-I部分

那么我该如何配置呢?有 INCLUDEPATH 吗?

d scons

2
推荐指数
1
解决办法
2363
查看次数