0

背景:我有一个用户实体。用户实体如下所示:

private String name;
private String address;
private List<Picture> pictureList; //The users pictures
private int rolesBitmask; //Is a bitmask for around 20 different roles
private int anotherBitmask; //Is similar bitmask as the roles
//
// Maybe 20 more fields..

我将有一个 AJAX 搜索网页,它将对所有这些字段执行 JPQL 查询(可能不是图片,而是大多数字段)。

例如,网络用户可能正在搜索名称为“An%”、居住在“Pica%”之类的地址、具有“printer”、“admin”、“guest”角色的用户,并且不关心其余的可用的角色。“printer”、“admin”和“guest”角色根据预定义的值被解释为位掩码。

我的第一个问题:

仅在 1 个 JPQL / 任何查询中执行此类查询是不是一个坏主意?

第二个问题: 如果我决定继续进行这些“复杂”查询,那么性能如何(请记住,它是一个 AJAX 网页,每次用户更改表单时它可能是一个新的数据库访问)。

第三个问题: 在 SQL 中,我会做这样的事情来获取所有用户的姓名、地址和角色:

SELECT * FROM User WHERE (rolesBitmask & queryRoleBitmask) ^ queryRoleBitmask = 0 AND name LIKE 'An%' AND address LIKE 'Pica%';

据我所知,JPQL 不支持按位运算,因此我必须使用本机查询或尝试将其转换为等效的 JPQL,但我不知道我应该如何去做。你?

你能在这里指导我吗,也许我不得不把整个 AJAX 搜索网页的想法扔到 thrashcan 中,或者你怎么看?当您处理许多标准时,最佳实践是什么?

提前致谢

4

1 回答 1

1

您可以为此使用本机 SQL 查询。

JPQL 不直接支持按位运算符,但如果您使用 EclipseLink,则可以使用 SQL 运算符。

Select u from User u where SQL('((? & ?) ^ ?)', u.rolesBitmask, u.queryRoleBitmask, u.queryRoleBitmask) = 0 and u.name LIKE 'An%' AND u.address LIKE 'Pica%'

http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL#SQL

于 2012-08-07T13:54:14.807 回答