我今天发现了JPA 2.0 Criteria API并希望了解它.刚刚通过一些例子,并试着去做.我有一个带有柱子的餐桌水果:
常规的东西:
EntityManagerFactory emf = Persistence.createEntityManagerFactory("fruitManager");
EntityManager em = emf.createEntityManager();
//get the criteria builder
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Fruit> c = cb.createQuery(Fruit.class);
Run Code Online (Sandbox Code Playgroud)
如何使用条件构建以下查询:
select id, name, color where name like 'XY%' and color='orange'
Run Code Online (Sandbox Code Playgroud)
即如何:
还有什么地方可以通过几种不同类型的SQL查询获得更多关于'Criteria'的例子吗?
我有以下要求,但我无法决定采取的方法:
我需要将数据写入固定格式的输出文件,其中每条记录跨越多行,如下所示:
000120992599999990000000000000009291100000000000000000000000010000
000000000000000000000006050052570009700000050000990494920000111100
ABCDE:WXYZ 0200
descriptiongoesheredescriptiongoesheredescriptiongoesher0200
descriptiongoesheredescriptiongoesheredescriptiongoesher0200
descriptiongoesheredescriptiongoesheredescriptiongoesher0200
descriptiongoesheredescriptiongoesheredescriptiongoesher0200
000000000000000000000006050052730005700001100000090494920000221200
ABCDE:WXYZ 0200
descriptiongoesheredescriptiongoesheredescriptiongoesher0200
descriptiongoesheredescriptiongoesheredescriptiongoesher0200
000000000000000000000006050113110009700000000000000494920000311100
ABCDE:WXYZ 0200
descriptiongoesheredescriptiongoesheredescriptiongoesher0200
descriptiongoesheredescriptiongoesheredescriptiongoesher0200
descriptiongoesheredescriptiongoesheredescriptiongoesher0200
000012099259999999000000000000000929110000000000000000000000001000
Run Code Online (Sandbox Code Playgroud)
这是以上示例中的一条记录:
000000000000000000000006050052570009700000050000990494920000111100
ABCDE:WXYZ 0200
descriptiongoesheredescriptiongoesheredescriptiongoesher0200
descriptiongoesheredescriptiongoesheredescriptiongoesher0200
descriptiongoesheredescriptiongoesheredescriptiongoesher0200
descriptiongoesheredescriptiongoesheredescriptiongoesher0200
Run Code Online (Sandbox Code Playgroud)
第一行和最后一行分别是页眉和页脚.每条记录的第一行包含几个细节.第二行有一些其他的空格细节.
我有一个很长的描述字段,我需要分成56个字符的部分,然后追加记录的第3行以上.
所以在一些记录中,这可能只是一行,而在某些记录中也可能是三行.
我需要有关如何在上述场景中设计我的项目编写者的指导.
聂
我有一个餐桌水果,有四列id,名称,颜色,形状.
表中的条目是:
1, apple, red, round
2, banana, yellow, long
3, tomato, red, round
4, orange, orange, round
Run Code Online (Sandbox Code Playgroud)
现在我创建了一个实体类Fruit映射到上面的表.
@Entity
@Table(name="fruit")
public class Fruit implements Serializable {
@Id
@Column(name="ID")
String id;
@Column(name="NAME")
String name;
@Column(name="COLOR")
String color;
@Column(name="SHAPE")
String shape;
//getters/setters goes here
}
Run Code Online (Sandbox Code Playgroud)
在我的DAO类中,代码是:
String myQuery = "Select f.shape, f.name from Fruit f where f.shape = :shape";
Query query = this.em.createQuery(myQuery);
query.setParameter("shape", "round");
Run Code Online (Sandbox Code Playgroud)
很明显,运行上面的查询将返回3行.
我有一个简单的TO类FruitSearchTO
class FruitSearchTO
{
String shape;
String name;
//getters/setters here
}
Run Code Online (Sandbox Code Playgroud)
此TO符合我的查询返回的行.
但在我的DAO中运行如下:
List<FruitSearchTO> fruitList …Run Code Online (Sandbox Code Playgroud) 我在persistence.xml中声明了我的默认模式:
<property name="hibernate.default_schema" value="MYSCHEMA" />
Run Code Online (Sandbox Code Playgroud)
但是,现在我想从CURRSCHEMA访问一个表,该表位于同一个数据库中.
实体在CURRSCHEMA中创建为Curreny表的货币.
但运行以下查询会尝试访问MYSCHEMA.Currency,从而导致错误.
// here will go the code to fetch currency
String currencySql = "select C.pk.currCode from Currency C where C.pk.idCode = :idCode";
Query currencyQuery = this.em.createQuery(currencySql);
currencyQuery.setParameter("idCode", "CCY");
Run Code Online (Sandbox Code Playgroud)
我的实体正在使用注释:
@Entity
@Table(name="CURRENCY")
public class Currency implements Serializable {
Run Code Online (Sandbox Code Playgroud)
将@Table(name ="CURRENCY")更改为@Table(name ="CURRSCHEMA.CURRENCY")不起作用.
怎么去这个?
我有一个从表中返回金额的查询:
select bus_price from mySchema.BusTable;
Run Code Online (Sandbox Code Playgroud)
这将返回如下金额:
526547
123456
456789.25
12478.35
Run Code Online (Sandbox Code Playgroud)
我在jasper报告中使用了以上金额.
但是,我希望报告中的输出显示为:
$526,547.00
$123,456.00
$456,789.25
$12,478.35
Run Code Online (Sandbox Code Playgroud)
JRXML代码片段是:
<textField isStretchWithOverflow="true">
<reportElement stretchType="RelativeToTallestObject" x="700" y="0" width="100" height="30"/>
<textElement/>
<textFieldExpression class="java.math.BigDecimal">
<![CDATA[$F{BusPrices}]]>
</textFieldExpression>
</textField>
Run Code Online (Sandbox Code Playgroud)
我知道我必须使用模式.但是,我无法使其发挥作用.
运用
<textField isStretchWithOverflow="true" pattern='$###,##0.00'>
Run Code Online (Sandbox Code Playgroud)
不管用.
我错过了什么?
谢谢阅读!
我在一个名为string1到string7的程序中有七个字符串.
每个字符串的大小为30个字符.
我将得到一个未知长度的输入字符串.
我必须将此输入字符串拆分为30个字符串,然后将第一个子字符串设置为string1,将第二个字符串设置为string2,依此类推,直到可能为止.如果输入字符串大于210个字符,则结尾处的剩余字符串将被忽略.
当输入字符串的大小小于210 char时,如何处理这种情况.
对于例如145,在这种情况下,string1到string4将是full,而string5将由剩余的15个char组成.
怎么处理这个很好?
我可以通过char读取char并将前30个char和string1,next2等接下来直到所有char消耗完为止.
但是有更好的方法吗?
在Spring Batch作业中测试以下场景的方法是什么:
1)在弹簧批处理作业中的一个步骤中运行的独立tasklet.
2)一个由几个步骤组成的作业,其中一些步骤具有itemreader,itemprocessor,itemwriters,而一些步骤具有tasklet.
3)项目阅读器,其中对项目阅读器的输入查询是一个非常复杂的SQL查询,具有来自许多表的连接 - 这种情况不允许清空所有使用的表并用虚拟数据填充它们以进行测试.换句话说,可能存在真实世界场景,其中无法清空表格以进行测试.那种情况应该是什么方法?
如果我在这个论坛上得到一些关于要采取的方法的帮助,我想准备一个示例套件,其中包含测试具有不同作业场景的spring批处理作业的示例.
以下程序的输出:
public class TestClass {
public static void main(final String[] args){
String token = "null\n";
token.trim();
System.out.println("*");
System.out.println(token);
System.out.println("*");
}
}
Run Code Online (Sandbox Code Playgroud)
是:
*
null
*
Run Code Online (Sandbox Code Playgroud)
然而
否则说.
我错过了什么?
我想在POI中形成如下的excel输出:

从图像中可以清楚地看到,我分别在Header3,Header4和Header5下有3个子列.
清单如下:
ListA - 包含A列的值
ListB - 包含B列的值
List1 - 是每行3列的数据库行列表.第一列将在Header3下,第二列在Header 4下,第三列在Header 5下,即列C,F和I.
List2和List3 - 类似于List1,每个值分别在Header3,4和5下面.列表2在列D,G和J下,而列表3在E,H和K列下.
问题1:
我将标题名称存储为具有5个值的列表.
如何迭代此列表以将值分配给合并区域?
我正在做类似下面但不起作用的事情:
// first two headers
for (int i = 0; i < headers.size() - 3; i++) {
headerCell = headerRow.createCell(i);
headerCell.setCellValue(allHeaders.get(i).toUpperCase());
headerCell.setCellStyle(styles.get("header"));
}
// Merging
sheet.addMergedRegion(org.apache.poi.ss.util.CellRangeAddress.valueOf("$C$1:$E$1"));
sheet.addMergedRegion(org.apache.poi.ss.util.CellRangeAddress.valueOf("$F$1:$H$1"));
sheet.addMergedRegion(org.apache.poi.ss.util.CellRangeAddress.valueOf("$I$1:$K$1"));
for (int i = 3; i < headers.size(); i++) {
headerCell = headerRow.createCell(i);
headerCell.setCellValue(allHeaders.get(i).toUpperCase());
headerCell.setCellStyle(styles.get("header"));
}
Run Code Online (Sandbox Code Playgroud)
问题2:
如上所述,如何通过List3迭代ListA来输入值?
谢谢阅读!
我在DB2中有一个包含多个列的表MY_TABLE:
PRODUCT_ID
ADDED_DT
PRODUCT_NAME
PRODUCT_COLOR
PRODUCT_PRICE
EXPIRY_DT
Run Code Online (Sandbox Code Playgroud)
在这些列中,以下列构成主键:
PRODUCT_ID
ADDED_DT
Run Code Online (Sandbox Code Playgroud)
我想将EXPIRY_DT添加为主键,以便该表现在有三个主键即.PRODUCT_ID,ADDED_DT和EXPIRY_DT
我尝试了下面的一组命令:
ALTER TABLE MY_TABLE ADD PRIMARY KEY (EXPIRY_DT);
REORG TABLE MY_TABLE;
Run Code Online (Sandbox Code Playgroud)
但是,查询失败并显示错误:
Table "MY_TABLE" already has a "PRIMARY" key.
Run Code Online (Sandbox Code Playgroud)
如何实现这一目标?
java ×4
hibernate ×3
jpa ×3
spring-batch ×2
string ×2
apache-poi ×1
criteria-api ×1
db2 ×1
jpa-2.0 ×1
junit ×1
newline ×1
split ×1
sql ×1
trim ×1