Hibernate JPA Specification重写toPredicate多条件查询

使用手册实体类,省略了getter/setter

@Entity
@Table(name="manual")
public class Manual {
	
	@Id
	@GeneratedValue
	private Long id;
	/**
	 * 文件名称
	 */
	@Column(name="filename")
	private String fileName;

	/**
	 * 应用类型
	 */
	@JsonIgnore
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="applicationid")
	private Application application;

使用手册实体Bean

public class ManualListBean {

	private final Manual manual;
	
	public ManualListBean(Manual manual){
		this.manual = manual;
	}
	@JsonView(DataTablesOutput.View.class)
	public Long getId(){
		return manual.getId();
	}
	@JsonView(DataTablesOutput.View.class)
	public String getFileName(){
		return manual.getFileName();
	}
	
	@JsonView(DataTablesOutput.View.class)
	public String getApplicationName(){
		Application application = manual.getApplication();
		if(application != null){
			return application.getName();
		}
		return "";
	}
}

应用类型实体类,省略了getter/setter

@Entity
@Table(name = "applicationtype")
public class ApplicationType implements java.io.Serializable{

	private static final long serialVersionUID = 899339761892494451L;

	@Id
    	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	
	@Column(name = "name")
	private String name;//应用名称

	@JsonIgnore
	@OneToMany(fetch=FetchType.LAZY, mappedBy="applicationType",cascade=CascadeType.ALL)
	private Set<InstructionManual> instructionManualSet = new HashSet<>();
Bean
public class ApplicationListBean extends DataTableBean<Application>{
	@JsonView(DataTablesOutput.View.class)
	public Long getId() {
		return target.getId();
	}
	
	@JsonView(DataTablesOutput.View.class)
	public String getName() {
		return target.getName();
	}

}
ManualController

	@JsonView(DataTablesOutput.View.class)
	@RequestMapping(value="/manualList.json",method=RequestMethod.POST)
	@ResponseBody
	public DataTablesOutput<ManualListBean> manualList(@Valid DataTablesInput input, HttpServletRequest request){
		Test test = (Test) request.getSession().getAttribute("test");
		List<Application> applications = applicationService.findByApplication(test);
		final Set<Application> applicationSet = new HashSet<>(applications);
		final String name = ".xxx";
		Specification<Manual> additionalSpecification = new Specification<Manual>() {
			@Override
			public Predicate toPredicate(Root<Manual> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
				if(applicationSet.size()>0){
					List<Predicate> predicateList = new ArrayList<>();
					Iterator<Application> iterator = applicationSet.iterator();
					while(iterator.hasNext()){ 
						Application application = iterator.next();
						Predicate p1 = cb.equal(root.<Application>get("application"), application);
						predicateList.add(p1);	
					}
					Predicate[] pre = new Predicate[predicateList.size()];
					query.where(predicateList.toArray(pre));
				}else{
					Predicate p1 = cb.equal(root.<String>get("filename"), name);
					query.where(p1);
				}
				return query.getRestriction(); 
			}
		};
		DataTablesOutput<Manual> manualOutput = this.manualService.findAll(input, additionalSpecification);
		DataTablesOutput<ManualListBean> output = new DataTablesOutput<>();
		output.setDraw(manualOutput.getDraw());
		output.setError(manualOutput.getError());
		output.setRecordsFiltered(manualOutput.getRecordsFiltered());
		output.setRecordsTotal(manualOutput.getRecordsTotal());
		List<ManualListBean> listData = new ArrayList<>();
		for (Manual manual : manualOutput.getData()) {
			ManualListBean manualListBean = new ManualListBean(manual);
			listData.add(manualListBean);
		}
		output.setData(listData);
		return output;
	}
	
前端
$(function() {
	$('#form').DataTable({
		serverSide : true,
		destroy : true,
		ajax : {
			url : ctx + '/manual/manualList.json',
			type : "post"
		},
		columns : [
		           {"data" : "id"},
		           {"data" : "fileName"},
		           {"data" : "application.name"},
		           {"data" : "id"}
		],
		columnDefs : [{
		            	    width : '11%',
			       			render : function(data, type, row) {
			       				return data;
			       			},
			       			targets: [0,1]
		               },
		               {
			                width: '20%',
			                render: function (data, type, row) {
			                    return row.applicationName;
			                },
			                targets: [2]
			           },
		               {
			width : '20%',
			render : function(data, type, row) {
			if (data) {var html = '<ul class="icons-list"><li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">'
			+ '<i class="icon-menu9"></i></a>'
			+ '<ul class="dropdown-menu dropdown-menu-right">'
											
			+ '<li><a href="'+ ctx + '/manual/update/'+ data+ '"><i class="icon-diff-modified"></i>操作</a></li>'
											
			+ '</ul></li></ul>';
									return html;
								} else {
									return '';
								};
							},
							targets : 3,
						}]

	});
});
参考:http://www.knowsky.com/988841.html






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值