package com.querydsl.example.dao;
import com.querydsl.core.types.Predicate;
import com.querydsl.core.types.QBean;
import com.querydsl.example.dto.Person;
import com.querydsl.sql.SQLQueryFactory;
import org.springframework.transaction.annotation.Transactional;
import javax.inject.Inject;
import java.util.List;
import static com.querydsl.core.types.Projections.bean;
import static com.querydsl.example.sql.QPerson.person;
@Transactional
public class PersonDaoImpl implements PersonDao {
@Inject
SQLQueryFactory queryFactory;
final QBean<Person> personBean = bean(Person.class, person.all());
@Override
public Person findById(long id) {
return queryFactory.select(personBean)
.from(person)
.where(person.id.eq(id))
.fetchOne();
}
@Override
public List<Person> findAll(Predicate... where) {
return queryFactory.select(personBean)
.from(person)
.where(where)
.fetch();
}
@Override
public Person save(Person p) {
Long id = p.getId();
if (id == null) {
id = queryFactory.insert(person)
.populate(p)
.executeWithKey(person.id);
p.setId(id);
} else {
queryFactory.update(person)
.populate(p)
.where(person.id.eq(id)).execute();
}
return p;
}
@Override
public long count() {
return queryFactory.from(person).fetchCount();
}
@Override
public void delete(Person p) {
queryFactory.delete(person)
.where(person.id.eq(p.getId()))
.execute();
}
}