一 准备
1.有表结构如何
CREATE TABLE `bbs_topic` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL DEFAULT '0',
`module_id` int(11) NOT NULL,
`post_count` int(11) NOT NULL DEFAULT '1',
`reply_count` int(11) NOT NULL DEFAULT '0',
`pv` int(11) NOT NULL DEFAULT '0',
`content` varchar(150) NOT NULL,
`emotion` tinyint(2) DEFAULT NULL,
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`is_nice` bit(1) NOT NULL DEFAULT b'0',
`is_up` bit(1) NOT NULL DEFAULT b'0',
PRIMARY KEY (`id`),
KEY `moduleID_T` (`module_id`),
KEY `userID_T` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=80 DEFAULT CHARSET=utf8;
2.生成相应的entity对象为BbsTopic
@Entity
@Table(name = "bbs_topic")
public class BbsTopic{
(省略....)
}
二 问题
现在有一查询对象
public class IndexObject{
private String topicId;
private String content;
}
原先我是先查询出所有的topic对象,然后再循环赋值。于是我就想能不能在jpa中直接生成IndexObject对象
三 尝试
可以使用List<Object[]> 接收。但是不是很方便
//用objet[] 可以接受返回对象
@Query(value = "SELECT id as topicId,content FROM bbs_topic WHERE create_time BETWEEN ?1 AND ?2",nativeQuery = true)
@Deprecated
List<Object[]> getBbsTopicListByDate(Date fileupdateDate, Date topiclastupdate);
之后我采用new相应对象
/*返回对象属性如何取别名? 不用as,但是数据类型要对*/
@Query(value = "SELECT new com.wayne.common.lucene.entity.IndexObject(p.id topicId,p.content) FROM BbsTopic p WHERE create_time BETWEEN ?1 AND ?2")
List<IndexObject> getBbsTopicListByDate2(Date fileupdateDate, Date topiclastupdate);
但是报错了,最后找原因是new 需要对象中有相应的构造函数,并且数据类型要要能对应。所以如果对象和数据层中的数据类型不同的话,是无法new的。
经过一番尝试由于IndexObject对象我不想改变,只能先差Topic对象再循环赋值了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。