1.默认参数
byte, Byte
short, Short
int, Integer
long, Long
float, Float
double, Doubleboolean, Boolean
byte[]
String
Date
2.自定义参数
使用数据库支持的原生数据类型通过PropertyConverter类转换成你想要的属性。
1.给自定义类型参数添加 @Convert注释并添加对应参数:
converter:参数转换类,columnType:在数据库中对应的原始支持类型
2. 实现PropertyConverter类
下面例子为list转成String。
@Entity
public class User {
@Id
private Long id;
@Convert(converter = GreenConverter.class, columnType = String.class)
}
//-----------------转换类
public class GreenConverter implements PropertyConverter<List,String> {
@Override
public List convertToEntityProperty(String databaseValue) {
if (databaseValue == null) {
return null;
}
else {
List lista = Arrays.asList(databaseValue.split(","));
return lista;
}
}
@Override
public String convertToDatabaseValue(List entityProperty) {
if(entityProperty==null){
return null;
}
else{
StringBuilder sb= new StringBuilder();
for(Object link:entityProperty){
sb.append(link);
sb.append(",");
}
return sb.toString();
}
}
}
greenDao查询原则:同一个Session如果已经记录了entity,下次查询会直接从内存中读取,若内存中没有再从数据库查找。注意当entity发生改变时,仍然从缓存中读取。此时,为保证数据的正确性需要在entity更改后执行清除缓存操作.清除方法:
1.清除所所有的缓存
daoSession.clear();
2.清除指定类缓存
projectDao = daoSession.getNoteDao();
projectDao.detachAll();
关联:在主表中定义一个外键去关联副表,然后需要用外键去副表中查询所需要的数据。
joinProperty参数来定义一个外键
@Entity
public class Order {
@Id //主键 必须为long
private Long id;
private long customerId;
@ToOne(joinProperty = "customerId") //表示order类的customerId字段与Customer类的id相等
private Customer customer;
}
@Entity
public class Customer {
@Id
private Long id;
}
2.1 referencedJoinProperty ,目标实体拥有源实体的主键,然后在源实体里将目标实体中的外键((customerId))作为referencedJoinProperty的属性。也就是下面例子中的customerId表示的是Customer 中的主键id.
//源实体
@Entity
public class Customer {
@Id
private Long id;
@ToMany(referencedJoinProperty = "customerId")
private List orders;
}
//目标实体
@Entity
public class Order {
@Id private Long id;
private long customerId;
}
2.2 如果两个实体之间的关联外键不是通过id,而是通过自定义的属性就需要使用@JoinProperty。
@Entity
public class Customer {
@Id
private Long id;
@Unique
private String tag;
@ToMany(joinProperties = { @JoinProperty(name = "tag", referencedName = "customerTag") })
private List orders;
}
@Entity
public class Order {
@Id private Long id;
private Date date;
private String customerTag;
}
不是两个表或者两个对象直接关联,而是要通过一个“第三者”关联
@JoinEntity中的entity 表示中间表(第三者),sourceProperty 表示实体属性,targetProperty 表示外联实体。在两个实体中都需要写@JoinEntity。
@Entity
public class Person{
@Id(autoincrement = true)
private Long id;
private String name;
// 一对多,@JoinEntity注解:entity 中间表;sourceProperty 自身实体属性;targetProperty 外链实体属性
@ToMany @JoinEntity( entity = JoinStudentToPerson.class, sourceProperty = "pid", targetProperty = "sid" )
//一个person对应多个student
private List students;
---------------------------------------------------
//中间表 “第三者”
@Entity
public class JoinStudentToPerson {
private Long id; //和person关联的id
private Long pid; //和student关联的id private Long sid;
}
@Entity
public class Student {
@Id private Long id;
private String name;
// 多对多,@JoinEntity注解:entity 中间表;sourceProperty 自身实体属性;targetProperty 外链实体属性
@ToMany @JoinEntity( entity = JoinStudentToPerson.class, sourceProperty = "sid", targetProperty = "pid" )
//一个person对应多个student
private List persons; }
同样因为缓存问题,需要手动添加和移除。如:获取当前顾客的订单列表
List ordersList= customer.getOrders();
添加或者删除的订单为 :Order order = new Order();
1.添加
// 添加到数据库
daoSession.insert(order);
手动添加到订单列表ordersList.add(order )
2.删除
// 从数据库中移除
daoSession.delete(someOrder);
手动从缓存列表移除ordersList.remove(order )
join()
1.关联单个表
ueryBuilder.join()方法即可完成,第一个参数是关联的类,第二个是关联类中的关联属性。
//查询地址住在国贸的帅哥
QueryBuilder queryBuilder = userDao.queryBuilder();
queryBuilder.join(Address.class, AddressDao.Properties.userId) .where(AddressDao.Properties.Street.eq("国贸"));
List users = queryBuilder.list();
2.关联多个表
通过queryBuilder.join()链式调用来实现多表查询.
//查询在欧洲人口超过100000的城市
QueryBuilder qb = cityDao.queryBuilder().where(Properties.Population.ge(1000000));
Join country = qb.join(Properties.CountryId, Country.class);
Join continent = qb.join(country, CountryDao.Properties.ContinentId, Continent.class, ContinentDao.Properties.Id);
continent.where(ContinentDao.Properties.Name.eq("Europe"));
List bigEuropeanCities = qb.list();