深入理解查询语言:从基础到高级应用
立即解锁
发布时间: 2025-08-19 02:01:35 阅读量: 2 订阅数: 11 


Java持久化实战:JPA深入解析
### 深入理解查询语言:从基础到高级应用
#### 1. 查询语言基础与示例应用
在使用查询语言时,无需了解对象的映射方式,因为查询语言完全基于对象模型和实体间的逻辑关系。查询翻译器会将面向对象的查询表达式转换为在数据库上执行查询所需的 SQL。
为了更好地练习编写查询,可使用如下示例应用:
```java
package persistence;
import java.io.*;
import java.util.*;
import javax.persistence.*;
import org.apache.commons.lang.builder.*;
public class QueryTester {
public static void main(String[] args) throws Exception {
String unitName = args[0];
EntityManagerFactory emf =
Persistence.createEntityManagerFactory(unitName);
EntityManager em = emf.createEntityManager();
BufferedReader reader =
new BufferedReader(new InputStreamReader(System.in));
for (;;) {
System.out.print("JP QL> ");
String query = reader.readLine();
if (query.equals("quit")) {
break;
}
if (query.length() == 0) {
continue;
}
try {
List result = em.createQuery(query).getResultList();
if (result.size() > 0) {
int count = 0;
for (Object o : result) {
System.out.print(++count + " ");
printResult(o);
}
} else {
System.out.println("0 results returned");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
private static void printResult(Object result) throws Exception {
if (result == null) {
System.out.print("NULL");
} else if (result instanceof Object[]) {
Object[] row = (Object[]) result;
System.out.print("[");
for (int i = 0; i < row.length; i++) {
printResult(row[i]);
}
System.out.print("]");
} else if (result instanceof Long ||
result instanceof Double ||
result instanceof String) {
System.out.print(result.getClass().getName() + ": " + result);
} else {
System.out.print(ReflectionToStringBuilder.toString(result,
ToStringStyle.SHORT_PREFIX_STYLE));
}
System.out.println();
}
}
```
使用此应用的唯一要求是提供包含要查询实体的持久化单元名称。应用会从命令行读取该名称并尝试创建相应的 `EntityManagerFactory`。初始化成功后,可在 `JP QL>` 提示符下输入查询,查询将被执行并输出结果。
以下是一个示例会话:
```plaintext
JP QL> SELECT p FROM Phone p WHERE p.type NOT IN ('office', 'home')
1 Phone[id=5,number=516-555-1234,type=cel
```
0
0
复制全文
相关推荐










